//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_spi(SotoInternal) import SotoCore

extension SSM {
    // MARK: Enums

    public enum AccessRequestStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case approved = "Approved"
        case expired = "Expired"
        case pending = "Pending"
        case rejected = "Rejected"
        case revoked = "Revoked"
        public var description: String { return self.rawValue }
    }

    public enum AccessType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case justintime = "JustInTime"
        case standard = "Standard"
        public var description: String { return self.rawValue }
    }

    public enum AssociationComplianceSeverity: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case critical = "CRITICAL"
        case high = "HIGH"
        case low = "LOW"
        case medium = "MEDIUM"
        case unspecified = "UNSPECIFIED"
        public var description: String { return self.rawValue }
    }

    public enum AssociationExecutionFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case createdTime = "CreatedTime"
        case executionId = "ExecutionId"
        case status = "Status"
        public var description: String { return self.rawValue }
    }

    public enum AssociationExecutionTargetsFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case resourceId = "ResourceId"
        case resourceType = "ResourceType"
        case status = "Status"
        public var description: String { return self.rawValue }
    }

    public enum AssociationFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case associationId = "AssociationId"
        case associationName = "AssociationName"
        case instanceId = "InstanceId"
        case lastExecutedAfter = "LastExecutedAfter"
        case lastExecutedBefore = "LastExecutedBefore"
        case name = "Name"
        case resourceGroupName = "ResourceGroupName"
        case status = "AssociationStatusName"
        public var description: String { return self.rawValue }
    }

    public enum AssociationFilterOperatorType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case equal = "EQUAL"
        case greaterThan = "GREATER_THAN"
        case lessThan = "LESS_THAN"
        public var description: String { return self.rawValue }
    }

    public enum AssociationStatusName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "Failed"
        case pending = "Pending"
        case success = "Success"
        public var description: String { return self.rawValue }
    }

    public enum AssociationSyncCompliance: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case auto = "AUTO"
        case manual = "MANUAL"
        public var description: String { return self.rawValue }
    }

    public enum AttachmentHashType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case sha256 = "Sha256"
        public var description: String { return self.rawValue }
    }

    public enum AttachmentsSourceKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case attachmentReference = "AttachmentReference"
        case s3FileUrl = "S3FileUrl"
        case sourceUrl = "SourceUrl"
        public var description: String { return self.rawValue }
    }

    public enum AutomationExecutionFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case automationSubtype = "AutomationSubtype"
        case automationType = "AutomationType"
        case currentAction = "CurrentAction"
        case documentNamePrefix = "DocumentNamePrefix"
        case executionId = "ExecutionId"
        case executionStatus = "ExecutionStatus"
        case opsItemId = "OpsItemId"
        case parentExecutionId = "ParentExecutionId"
        case startTimeAfter = "StartTimeAfter"
        case startTimeBefore = "StartTimeBefore"
        case tagKey = "TagKey"
        case targetResourceGroup = "TargetResourceGroup"
        public var description: String { return self.rawValue }
    }

    public enum AutomationExecutionStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case approved = "Approved"
        case cancelled = "Cancelled"
        case cancelling = "Cancelling"
        case changeCalendarOverrideApproved = "ChangeCalendarOverrideApproved"
        case changeCalendarOverrideRejected = "ChangeCalendarOverrideRejected"
        case completedWithFailure = "CompletedWithFailure"
        case completedWithSuccess = "CompletedWithSuccess"
        case exited = "Exited"
        case failed = "Failed"
        case inprogress = "InProgress"
        case pending = "Pending"
        case pendingApproval = "PendingApproval"
        case pendingChangeCalendarOverride = "PendingChangeCalendarOverride"
        case rejected = "Rejected"
        case runbookInprogress = "RunbookInProgress"
        case scheduled = "Scheduled"
        case success = "Success"
        case timedout = "TimedOut"
        case waiting = "Waiting"
        public var description: String { return self.rawValue }
    }

    public enum AutomationSubtype: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case accessRequest = "AccessRequest"
        case changeRequest = "ChangeRequest"
        public var description: String { return self.rawValue }
    }

    public enum AutomationType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case crossAccount = "CrossAccount"
        case local = "Local"
        public var description: String { return self.rawValue }
    }

    public enum CalendarState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case closed = "CLOSED"
        case open = "OPEN"
        public var description: String { return self.rawValue }
    }

    public enum CommandFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case documentName = "DocumentName"
        case executionStage = "ExecutionStage"
        case invokedAfter = "InvokedAfter"
        case invokedBefore = "InvokedBefore"
        case status = "Status"
        public var description: String { return self.rawValue }
    }

    public enum CommandInvocationStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case cancelled = "Cancelled"
        case cancelling = "Cancelling"
        case delayed = "Delayed"
        case failed = "Failed"
        case inProgress = "InProgress"
        case pending = "Pending"
        case success = "Success"
        case timedOut = "TimedOut"
        public var description: String { return self.rawValue }
    }

    public enum CommandPluginStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case cancelled = "Cancelled"
        case failed = "Failed"
        case inProgress = "InProgress"
        case pending = "Pending"
        case success = "Success"
        case timedOut = "TimedOut"
        public var description: String { return self.rawValue }
    }

    public enum CommandStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case cancelled = "Cancelled"
        case cancelling = "Cancelling"
        case failed = "Failed"
        case inProgress = "InProgress"
        case pending = "Pending"
        case success = "Success"
        case timedOut = "TimedOut"
        public var description: String { return self.rawValue }
    }

    public enum ComplianceQueryOperatorType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case beginWith = "BEGIN_WITH"
        case equal = "EQUAL"
        case greaterThan = "GREATER_THAN"
        case lessThan = "LESS_THAN"
        case notEqual = "NOT_EQUAL"
        public var description: String { return self.rawValue }
    }

    public enum ComplianceSeverity: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case critical = "CRITICAL"
        case high = "HIGH"
        case informational = "INFORMATIONAL"
        case low = "LOW"
        case medium = "MEDIUM"
        case unspecified = "UNSPECIFIED"
        public var description: String { return self.rawValue }
    }

    public enum ComplianceStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case compliant = "COMPLIANT"
        case nonCompliant = "NON_COMPLIANT"
        public var description: String { return self.rawValue }
    }

    public enum ComplianceUploadType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case complete = "COMPLETE"
        case partial = "PARTIAL"
        public var description: String { return self.rawValue }
    }

    public enum ConnectionStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case connected = "connected"
        case notConnected = "notconnected"
        public var description: String { return self.rawValue }
    }

    public enum DescribeActivationsFilterKeys: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case activationIds = "ActivationIds"
        case defaultInstanceName = "DefaultInstanceName"
        case iamRole = "IamRole"
        public var description: String { return self.rawValue }
    }

    public enum DocumentFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case documentType = "DocumentType"
        case name = "Name"
        case owner = "Owner"
        case platformTypes = "PlatformTypes"
        public var description: String { return self.rawValue }
    }

    public enum DocumentFormat: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case json = "JSON"
        case text = "TEXT"
        case yaml = "YAML"
        public var description: String { return self.rawValue }
    }

    public enum DocumentHashType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case sha1 = "Sha1"
        case sha256 = "Sha256"
        public var description: String { return self.rawValue }
    }

    public enum DocumentMetadataEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case documentReviews = "DocumentReviews"
        public var description: String { return self.rawValue }
    }

    public enum DocumentParameterType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case string = "String"
        case stringList = "StringList"
        public var description: String { return self.rawValue }
    }

    public enum DocumentPermissionType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case share = "Share"
        public var description: String { return self.rawValue }
    }

    public enum DocumentReviewAction: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case approve = "Approve"
        case reject = "Reject"
        case sendForReview = "SendForReview"
        case updateReview = "UpdateReview"
        public var description: String { return self.rawValue }
    }

    public enum DocumentReviewCommentType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case comment = "Comment"
        public var description: String { return self.rawValue }
    }

    public enum DocumentStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case active = "Active"
        case creating = "Creating"
        case deleting = "Deleting"
        case failed = "Failed"
        case updating = "Updating"
        public var description: String { return self.rawValue }
    }

    public enum DocumentType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case applicationConfiguration = "ApplicationConfiguration"
        case applicationConfigurationSchema = "ApplicationConfigurationSchema"
        case autoApprovalPolicy = "AutoApprovalPolicy"
        case automation = "Automation"
        case changeCalendar = "ChangeCalendar"
        case changeTemplate = "Automation.ChangeTemplate"
        case cloudFormation = "CloudFormation"
        case command = "Command"
        case conformancePackTemplate = "ConformancePackTemplate"
        case deploymentStrategy = "DeploymentStrategy"
        case manualApprovalPolicy = "ManualApprovalPolicy"
        case package = "Package"
        case policy = "Policy"
        case problemAnalysis = "ProblemAnalysis"
        case problemAnalysisTemplate = "ProblemAnalysisTemplate"
        case quickSetup = "QuickSetup"
        case session = "Session"
        public var description: String { return self.rawValue }
    }

    public enum ExecutionMode: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case auto = "Auto"
        case interactive = "Interactive"
        public var description: String { return self.rawValue }
    }

    public enum ExecutionPreviewStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "Failed"
        case inProgress = "InProgress"
        case pending = "Pending"
        case success = "Success"
        public var description: String { return self.rawValue }
    }

    public enum ExternalAlarmState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case alarm = "ALARM"
        case unknown = "UNKNOWN"
        public var description: String { return self.rawValue }
    }

    public enum Fault: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case client = "Client"
        case server = "Server"
        case unknown = "Unknown"
        public var description: String { return self.rawValue }
    }

    public enum ImpactType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case mutating = "Mutating"
        case nonMutating = "NonMutating"
        case undetermined = "Undetermined"
        public var description: String { return self.rawValue }
    }

    public enum InstanceInformationFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case activationIds = "ActivationIds"
        case agentVersion = "AgentVersion"
        case associationStatus = "AssociationStatus"
        case iamRole = "IamRole"
        case instanceIds = "InstanceIds"
        case pingStatus = "PingStatus"
        case platformTypes = "PlatformTypes"
        case resourceType = "ResourceType"
        public var description: String { return self.rawValue }
    }

    public enum InstancePatchStateOperatorType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case equal = "Equal"
        case greaterThan = "GreaterThan"
        case lessThan = "LessThan"
        case notEqual = "NotEqual"
        public var description: String { return self.rawValue }
    }

    public enum InstancePropertyFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case activationIds = "ActivationIds"
        case agentVersion = "AgentVersion"
        case associationStatus = "AssociationStatus"
        case documentName = "DocumentName"
        case iamRole = "IamRole"
        case instanceIds = "InstanceIds"
        case pingStatus = "PingStatus"
        case platformTypes = "PlatformTypes"
        case resourceType = "ResourceType"
        public var description: String { return self.rawValue }
    }

    public enum InstancePropertyFilterOperator: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case beginWith = "BeginWith"
        case equal = "Equal"
        case greaterThan = "GreaterThan"
        case lessThan = "LessThan"
        case notEqual = "NotEqual"
        public var description: String { return self.rawValue }
    }

    public enum InventoryAttributeDataType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case number = "number"
        case string = "string"
        public var description: String { return self.rawValue }
    }

    public enum InventoryDeletionStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case complete = "Complete"
        case inProgress = "InProgress"
        public var description: String { return self.rawValue }
    }

    public enum InventoryQueryOperatorType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case beginWith = "BeginWith"
        case equal = "Equal"
        case exists = "Exists"
        case greaterThan = "GreaterThan"
        case lessThan = "LessThan"
        case notEqual = "NotEqual"
        public var description: String { return self.rawValue }
    }

    public enum InventorySchemaDeleteOption: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case deleteSchema = "DeleteSchema"
        case disableSchema = "DisableSchema"
        public var description: String { return self.rawValue }
    }

    public enum LastResourceDataSyncStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "Failed"
        case inprogress = "InProgress"
        case successful = "Successful"
        public var description: String { return self.rawValue }
    }

    public enum MaintenanceWindowExecutionStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case cancelled = "CANCELLED"
        case cancelling = "CANCELLING"
        case failed = "FAILED"
        case inProgress = "IN_PROGRESS"
        case pending = "PENDING"
        case skippedOverlapping = "SKIPPED_OVERLAPPING"
        case success = "SUCCESS"
        case timedOut = "TIMED_OUT"
        public var description: String { return self.rawValue }
    }

    public enum MaintenanceWindowResourceType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case instance = "INSTANCE"
        case resourceGroup = "RESOURCE_GROUP"
        public var description: String { return self.rawValue }
    }

    public enum MaintenanceWindowTaskCutoffBehavior: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case cancelTask = "CANCEL_TASK"
        case continueTask = "CONTINUE_TASK"
        public var description: String { return self.rawValue }
    }

    public enum MaintenanceWindowTaskType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case automation = "AUTOMATION"
        case lambda = "LAMBDA"
        case runCommand = "RUN_COMMAND"
        case stepFunctions = "STEP_FUNCTIONS"
        public var description: String { return self.rawValue }
    }

    public enum ManagedStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case all = "All"
        case managed = "Managed"
        case unmanaged = "Unmanaged"
        public var description: String { return self.rawValue }
    }

    public enum NodeAggregatorType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case count = "Count"
        public var description: String { return self.rawValue }
    }

    public enum NodeAttributeName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case agentVersion = "AgentVersion"
        case platformName = "PlatformName"
        case platformType = "PlatformType"
        case platformVersion = "PlatformVersion"
        case region = "Region"
        case resourceType = "ResourceType"
        public var description: String { return self.rawValue }
    }

    public enum NodeFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case accountId = "AccountId"
        case agentType = "AgentType"
        case agentVersion = "AgentVersion"
        case computerName = "ComputerName"
        case instanceId = "InstanceId"
        case instanceStatus = "InstanceStatus"
        case ipAddress = "IpAddress"
        case managedStatus = "ManagedStatus"
        case organizationalUnitId = "OrganizationalUnitId"
        case organizationalUnitPath = "OrganizationalUnitPath"
        case platformName = "PlatformName"
        case platformType = "PlatformType"
        case platformVersion = "PlatformVersion"
        case region = "Region"
        case resourceType = "ResourceType"
        public var description: String { return self.rawValue }
    }

    public enum NodeFilterOperatorType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case beginWith = "BeginWith"
        case equal = "Equal"
        case notEqual = "NotEqual"
        public var description: String { return self.rawValue }
    }

    public enum NodeTypeName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case instance = "Instance"
        public var description: String { return self.rawValue }
    }

    public enum NotificationEvent: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case all = "All"
        case cancelled = "Cancelled"
        case failed = "Failed"
        case inProgress = "InProgress"
        case success = "Success"
        case timedOut = "TimedOut"
        public var description: String { return self.rawValue }
    }

    public enum NotificationType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case command = "Command"
        case invocation = "Invocation"
        public var description: String { return self.rawValue }
    }

    public enum OperatingSystem: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case almaLinux = "ALMA_LINUX"
        case amazonLinux = "AMAZON_LINUX"
        case amazonLinux2 = "AMAZON_LINUX_2"
        case amazonLinux2022 = "AMAZON_LINUX_2022"
        case amazonLinux2023 = "AMAZON_LINUX_2023"
        case centOS = "CENTOS"
        case debian = "DEBIAN"
        case macOS = "MACOS"
        case oracleLinux = "ORACLE_LINUX"
        case raspbian = "RASPBIAN"
        case redhatEnterpriseLinux = "REDHAT_ENTERPRISE_LINUX"
        case rockyLinux = "ROCKY_LINUX"
        case suse = "SUSE"
        case ubuntu = "UBUNTU"
        case windows = "WINDOWS"
        public var description: String { return self.rawValue }
    }

    public enum OpsFilterOperatorType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case beginWith = "BeginWith"
        case equal = "Equal"
        case exists = "Exists"
        case greaterThan = "GreaterThan"
        case lessThan = "LessThan"
        case notEqual = "NotEqual"
        public var description: String { return self.rawValue }
    }

    public enum OpsItemDataType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case searchableString = "SearchableString"
        case string = "String"
        public var description: String { return self.rawValue }
    }

    public enum OpsItemEventFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case opsitemId = "OpsItemId"
        public var description: String { return self.rawValue }
    }

    public enum OpsItemEventFilterOperator: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case equal = "Equal"
        public var description: String { return self.rawValue }
    }

    public enum OpsItemFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case accessRequestApproverArn = "AccessRequestByApproverArn"
        case accessRequestApproverId = "AccessRequestByApproverId"
        case accessRequestIsReplica = "AccessRequestByIsReplica"
        case accessRequestRequesterArn = "AccessRequestByRequesterArn"
        case accessRequestRequesterId = "AccessRequestByRequesterId"
        case accessRequestSourceAccountId = "AccessRequestBySourceAccountId"
        case accessRequestSourceOpsItemId = "AccessRequestBySourceOpsItemId"
        case accessRequestSourceRegion = "AccessRequestBySourceRegion"
        case accessRequestTargetResourceId = "AccessRequestByTargetResourceId"
        case accountId = "AccountId"
        case actualEndTime = "ActualEndTime"
        case actualStartTime = "ActualStartTime"
        case automationId = "AutomationId"
        case category = "Category"
        case changeRequestApproverArn = "ChangeRequestByApproverArn"
        case changeRequestApproverName = "ChangeRequestByApproverName"
        case changeRequestRequesterArn = "ChangeRequestByRequesterArn"
        case changeRequestRequesterName = "ChangeRequestByRequesterName"
        case changeRequestTargetsResourceGroup = "ChangeRequestByTargetsResourceGroup"
        case changeRequestTemplate = "ChangeRequestByTemplate"
        case createdBy = "CreatedBy"
        case createdTime = "CreatedTime"
        case insightType = "InsightByType"
        case lastModifiedTime = "LastModifiedTime"
        case operationalData = "OperationalData"
        case operationalDataKey = "OperationalDataKey"
        case operationalDataValue = "OperationalDataValue"
        case opsitemId = "OpsItemId"
        case opsitemType = "OpsItemType"
        case plannedEndTime = "PlannedEndTime"
        case plannedStartTime = "PlannedStartTime"
        case priority = "Priority"
        case resourceId = "ResourceId"
        case severity = "Severity"
        case source = "Source"
        case status = "Status"
        case title = "Title"
        public var description: String { return self.rawValue }
    }

    public enum OpsItemFilterOperator: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case contains = "Contains"
        case equal = "Equal"
        case greaterThan = "GreaterThan"
        case lessThan = "LessThan"
        public var description: String { return self.rawValue }
    }

    public enum OpsItemRelatedItemsFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case associationId = "AssociationId"
        case resourceType = "ResourceType"
        case resourceUri = "ResourceUri"
        public var description: String { return self.rawValue }
    }

    public enum OpsItemRelatedItemsFilterOperator: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case equal = "Equal"
        public var description: String { return self.rawValue }
    }

    public enum OpsItemStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case approved = "Approved"
        case cancelled = "Cancelled"
        case cancelling = "Cancelling"
        case changeCalendarOverrideApproved = "ChangeCalendarOverrideApproved"
        case changeCalendarOverrideRejected = "ChangeCalendarOverrideRejected"
        case closed = "Closed"
        case completedWithFailure = "CompletedWithFailure"
        case completedWithSuccess = "CompletedWithSuccess"
        case failed = "Failed"
        case inProgress = "InProgress"
        case open = "Open"
        case pending = "Pending"
        case pendingApproval = "PendingApproval"
        case pendingChangeCalendarOverride = "PendingChangeCalendarOverride"
        case rejected = "Rejected"
        case resolved = "Resolved"
        case revoked = "Revoked"
        case runbookInProgress = "RunbookInProgress"
        case scheduled = "Scheduled"
        case timedOut = "TimedOut"
        public var description: String { return self.rawValue }
    }

    public enum ParameterTier: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case advanced = "Advanced"
        case intelligentTiering = "Intelligent-Tiering"
        case standard = "Standard"
        public var description: String { return self.rawValue }
    }

    public enum ParameterType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case secureString = "SecureString"
        case string = "String"
        case stringList = "StringList"
        public var description: String { return self.rawValue }
    }

    public enum ParametersFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case keyId = "KeyId"
        case name = "Name"
        case type = "Type"
        public var description: String { return self.rawValue }
    }

    public enum PatchAction: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case allowAsDependency = "ALLOW_AS_DEPENDENCY"
        case block = "BLOCK"
        public var description: String { return self.rawValue }
    }

    public enum PatchComplianceDataState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case availableSecurityUpdate = "AVAILABLE_SECURITY_UPDATE"
        case failed = "FAILED"
        case installed = "INSTALLED"
        case installedOther = "INSTALLED_OTHER"
        case installedPendingReboot = "INSTALLED_PENDING_REBOOT"
        case installedRejected = "INSTALLED_REJECTED"
        case missing = "MISSING"
        case notApplicable = "NOT_APPLICABLE"
        public var description: String { return self.rawValue }
    }

    public enum PatchComplianceLevel: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case critical = "CRITICAL"
        case high = "HIGH"
        case informational = "INFORMATIONAL"
        case low = "LOW"
        case medium = "MEDIUM"
        case unspecified = "UNSPECIFIED"
        public var description: String { return self.rawValue }
    }

    public enum PatchComplianceStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case compliant = "COMPLIANT"
        case nonCompliant = "NON_COMPLIANT"
        public var description: String { return self.rawValue }
    }

    public enum PatchDeploymentStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case approved = "APPROVED"
        case explicitApproved = "EXPLICIT_APPROVED"
        case explicitRejected = "EXPLICIT_REJECTED"
        case pendingApproval = "PENDING_APPROVAL"
        public var description: String { return self.rawValue }
    }

    public enum PatchFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case advisoryId = "ADVISORY_ID"
        case arch = "ARCH"
        case bugzillaId = "BUGZILLA_ID"
        case classification = "CLASSIFICATION"
        case cveId = "CVE_ID"
        case epoch = "EPOCH"
        case msrcSeverity = "MSRC_SEVERITY"
        case name = "NAME"
        case patchId = "PATCH_ID"
        case patchSet = "PATCH_SET"
        case priority = "PRIORITY"
        case product = "PRODUCT"
        case productFamily = "PRODUCT_FAMILY"
        case release = "RELEASE"
        case repository = "REPOSITORY"
        case section = "SECTION"
        case security = "SECURITY"
        case severity = "SEVERITY"
        case version = "VERSION"
        public var description: String { return self.rawValue }
    }

    public enum PatchOperationType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case install = "Install"
        case scan = "Scan"
        public var description: String { return self.rawValue }
    }

    public enum PatchProperty: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case patchClassification = "CLASSIFICATION"
        case patchMsrcSeverity = "MSRC_SEVERITY"
        case patchPriority = "PRIORITY"
        case patchProductFamily = "PRODUCT_FAMILY"
        case patchSeverity = "SEVERITY"
        case product = "PRODUCT"
        public var description: String { return self.rawValue }
    }

    public enum PatchSet: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case application = "APPLICATION"
        case os = "OS"
        public var description: String { return self.rawValue }
    }

    public enum PingStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case connectionLost = "ConnectionLost"
        case inactive = "Inactive"
        case online = "Online"
        public var description: String { return self.rawValue }
    }

    public enum PlatformType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case linux = "Linux"
        case macos = "MacOS"
        case windows = "Windows"
        public var description: String { return self.rawValue }
    }

    public enum RebootOption: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case noReboot = "NoReboot"
        case rebootIfNeeded = "RebootIfNeeded"
        public var description: String { return self.rawValue }
    }

    public enum ResourceDataSyncS3Format: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case jsonSerde = "JsonSerDe"
        public var description: String { return self.rawValue }
    }

    public enum ResourceType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case ec2Instance = "EC2Instance"
        case managedInstance = "ManagedInstance"
        public var description: String { return self.rawValue }
    }

    public enum ResourceTypeForTagging: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case association = "Association"
        case automation = "Automation"
        case document = "Document"
        case maintenanceWindow = "MaintenanceWindow"
        case managedInstance = "ManagedInstance"
        case opsItem = "OpsItem"
        case opsmetadata = "OpsMetadata"
        case parameter = "Parameter"
        case patchBaseline = "PatchBaseline"
        public var description: String { return self.rawValue }
    }

    public enum ReviewStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case approved = "APPROVED"
        case notReviewed = "NOT_REVIEWED"
        case pending = "PENDING"
        case rejected = "REJECTED"
        public var description: String { return self.rawValue }
    }

    public enum SessionFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case accessType = "AccessType"
        case invokedAfter = "InvokedAfter"
        case invokedBefore = "InvokedBefore"
        case owner = "Owner"
        case sessionId = "SessionId"
        case status = "Status"
        case targetId = "Target"
        public var description: String { return self.rawValue }
    }

    public enum SessionState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case active = "Active"
        case history = "History"
        public var description: String { return self.rawValue }
    }

    public enum SessionStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case connected = "Connected"
        case connecting = "Connecting"
        case disconnected = "Disconnected"
        case failed = "Failed"
        case terminated = "Terminated"
        case terminating = "Terminating"
        public var description: String { return self.rawValue }
    }

    public enum SignalType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case approve = "Approve"
        case reject = "Reject"
        case resume = "Resume"
        case revoke = "Revoke"
        case startStep = "StartStep"
        case stopStep = "StopStep"
        public var description: String { return self.rawValue }
    }

    public enum SourceType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case awsEc2Instance = "AWS::EC2::Instance"
        case awsIotThing = "AWS::IoT::Thing"
        case awsSsmManagedinstance = "AWS::SSM::ManagedInstance"
        public var description: String { return self.rawValue }
    }

    public enum StepExecutionFilterKey: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case action = "Action"
        case parentStepExecutionId = "ParentStepExecutionId"
        case parentStepIteration = "ParentStepIteration"
        case parentStepIteratorValue = "ParentStepIteratorValue"
        case startTimeAfter = "StartTimeAfter"
        case startTimeBefore = "StartTimeBefore"
        case stepExecutionId = "StepExecutionId"
        case stepExecutionStatus = "StepExecutionStatus"
        case stepName = "StepName"
        public var description: String { return self.rawValue }
    }

    public enum StopType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case cancel = "Cancel"
        case complete = "Complete"
        public var description: String { return self.rawValue }
    }

    // MARK: Shapes

    public struct AccountSharingInfo: AWSDecodableShape {
        /// The Amazon Web Services account ID where the current document is shared.
        public let accountId: String?
        /// The version of the current document shared with the account.
        public let sharedDocumentVersion: String?

        @inlinable
        public init(accountId: String? = nil, sharedDocumentVersion: String? = nil) {
            self.accountId = accountId
            self.sharedDocumentVersion = sharedDocumentVersion
        }

        private enum CodingKeys: String, CodingKey {
            case accountId = "AccountId"
            case sharedDocumentVersion = "SharedDocumentVersion"
        }
    }

    public struct Activation: AWSDecodableShape {
        /// The ID created by Systems Manager when you submitted the activation.
        public let activationId: String?
        /// The date the activation was created.
        public let createdDate: Date?
        /// A name for the managed node when it is created.
        public let defaultInstanceName: String?
        /// A user defined description of the activation.
        public let description: String?
        /// The date when this activation can no longer be used to register managed nodes.
        public let expirationDate: Date?
        /// Whether or not the activation is expired.
        public let expired: Bool?
        /// The Identity and Access Management (IAM) role to assign to the managed node.
        public let iamRole: String?
        /// The maximum number of managed nodes that can be registered using this activation.
        public let registrationLimit: Int?
        /// The number of managed nodes already registered with this activation.
        public let registrationsCount: Int?
        /// Tags assigned to the activation.
        public let tags: [Tag]?

        @inlinable
        public init(activationId: String? = nil, createdDate: Date? = nil, defaultInstanceName: String? = nil, description: String? = nil, expirationDate: Date? = nil, expired: Bool? = nil, iamRole: String? = nil, registrationLimit: Int? = nil, registrationsCount: Int? = nil, tags: [Tag]? = nil) {
            self.activationId = activationId
            self.createdDate = createdDate
            self.defaultInstanceName = defaultInstanceName
            self.description = description
            self.expirationDate = expirationDate
            self.expired = expired
            self.iamRole = iamRole
            self.registrationLimit = registrationLimit
            self.registrationsCount = registrationsCount
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case activationId = "ActivationId"
            case createdDate = "CreatedDate"
            case defaultInstanceName = "DefaultInstanceName"
            case description = "Description"
            case expirationDate = "ExpirationDate"
            case expired = "Expired"
            case iamRole = "IamRole"
            case registrationLimit = "RegistrationLimit"
            case registrationsCount = "RegistrationsCount"
            case tags = "Tags"
        }
    }

    public struct AddTagsToResourceRequest: AWSEncodableShape {
        /// The resource ID you want to tag. Use the ID of the resource. Here are some examples:  MaintenanceWindow: mw-012345abcde   PatchBaseline: pb-012345abcde   Automation: example-c160-4567-8519-012345abcde   OpsMetadata object: ResourceID for tagging is created from the Amazon Resource Name (ARN) for the object. Specifically, ResourceID is created from the strings that come after the word opsmetadata in the ARN. For example, an OpsMetadata object with an ARN of arn:aws:ssm:us-east-2:1234567890:opsmetadata/aws/ssm/MyGroup/appmanager has a ResourceID of either aws/ssm/MyGroup/appmanager or /aws/ssm/MyGroup/appmanager. For the Document and Parameter values, use the name of the resource. If you're tagging a shared document, you must use the full ARN of the document.  ManagedInstance: mi-012345abcde   The ManagedInstance type for this API operation is only for on-premises managed nodes. You must specify the name of the managed node in the following format: mi-ID_number . For example, mi-1a2b3c4d5e6f.
        public let resourceId: String
        /// Specifies the type of resource you are tagging.  The ManagedInstance type for this API operation is for on-premises managed nodes. You must specify the name of the managed node in the following format: mi-ID_number . For example, mi-1a2b3c4d5e6f.
        public let resourceType: ResourceTypeForTagging
        /// One or more tags. The value parameter is required.  Don't enter personally identifiable information in this field.
        public let tags: [Tag]

        @inlinable
        public init(resourceId: String, resourceType: ResourceTypeForTagging, tags: [Tag]) {
            self.resourceId = resourceId
            self.resourceType = resourceType
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.tags.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 1000)
        }

        private enum CodingKeys: String, CodingKey {
            case resourceId = "ResourceId"
            case resourceType = "ResourceType"
            case tags = "Tags"
        }
    }

    public struct AddTagsToResourceResult: AWSDecodableShape {
        public init() {}
    }

    public struct Alarm: AWSEncodableShape & AWSDecodableShape {
        /// The name of your CloudWatch alarm.
        public let name: String

        @inlinable
        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 255)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^(?!\\s*$).+$")
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
        }
    }

    public struct AlarmConfiguration: AWSEncodableShape & AWSDecodableShape {
        /// The name of the CloudWatch alarm specified in the configuration.
        public let alarms: [Alarm]
        /// When this value is true, your automation or command continues to run in cases where we can’t retrieve alarm status information from CloudWatch. In cases where we successfully retrieve an alarm status of OK or INSUFFICIENT_DATA, the automation or command continues to run, regardless of this value. Default is false.
        public let ignorePollAlarmFailure: Bool?

        @inlinable
        public init(alarms: [Alarm], ignorePollAlarmFailure: Bool? = nil) {
            self.alarms = alarms
            self.ignorePollAlarmFailure = ignorePollAlarmFailure
        }

        public func validate(name: String) throws {
            try self.alarms.forEach {
                try $0.validate(name: "\(name).alarms[]")
            }
            try self.validate(self.alarms, name: "alarms", parent: name, max: 1)
            try self.validate(self.alarms, name: "alarms", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case alarms = "Alarms"
            case ignorePollAlarmFailure = "IgnorePollAlarmFailure"
        }
    }

    public struct AlarmStateInformation: AWSDecodableShape {
        /// The name of your CloudWatch alarm.
        public let name: String
        /// The state of your CloudWatch alarm.
        public let state: ExternalAlarmState

        @inlinable
        public init(name: String, state: ExternalAlarmState) {
            self.name = name
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case state = "State"
        }
    }

    public struct AssociateOpsItemRelatedItemRequest: AWSEncodableShape {
        /// The type of association that you want to create between an OpsItem and a resource. OpsCenter supports IsParentOf and RelatesTo association types.
        public let associationType: String
        /// The ID of the OpsItem to which you want to associate a resource as a related item.
        public let opsItemId: String
        /// The type of resource that you want to associate with an OpsItem. OpsCenter supports the following types:  AWS::SSMIncidents::IncidentRecord: an Incident Manager incident.   AWS::SSM::Document: a Systems Manager (SSM) document.
        public let resourceType: String
        /// The Amazon Resource Name (ARN) of the Amazon Web Services resource that you want to associate with the OpsItem.
        public let resourceUri: String

        @inlinable
        public init(associationType: String, opsItemId: String, resourceType: String, resourceUri: String) {
            self.associationType = associationType
            self.opsItemId = opsItemId
            self.resourceType = resourceType
            self.resourceUri = resourceUri
        }

        public func validate(name: String) throws {
            try self.validate(self.opsItemId, name: "opsItemId", parent: name, pattern: "^(oi)-[0-9a-f]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case associationType = "AssociationType"
            case opsItemId = "OpsItemId"
            case resourceType = "ResourceType"
            case resourceUri = "ResourceUri"
        }
    }

    public struct AssociateOpsItemRelatedItemResponse: AWSDecodableShape {
        /// The association ID.
        public let associationId: String?

        @inlinable
        public init(associationId: String? = nil) {
            self.associationId = associationId
        }

        private enum CodingKeys: String, CodingKey {
            case associationId = "AssociationId"
        }
    }

    public struct Association: AWSDecodableShape {
        /// The ID created by the system when you create an association. An association is a binding between a document and a set of targets with a schedule.
        public let associationId: String?
        /// The association name.
        public let associationName: String?
        /// The association version.
        public let associationVersion: String?
        /// The version of the document used in the association. If you change a document version for a State Manager association, Systems Manager immediately runs the association unless you previously specifed the apply-only-at-cron-interval parameter.  State Manager doesn't support running associations that use a new version of a document if that document is shared from another account. State Manager always runs the default version of a document if shared from another account, even though the Systems Manager console shows that a new version was processed. If you want to run an association using a new version of a document shared form another account, you must set the document version to default.
        public let documentVersion: String?
        /// The number of hours that an association can run on specified targets. After the resulting cutoff time passes, associations that are currently running are cancelled, and no pending executions are started on remaining targets.
        public let duration: Int?
        /// The managed node ID.
        public let instanceId: String?
        /// The date on which the association was last run.
        public let lastExecutionDate: Date?
        /// The name of the SSM document.
        public let name: String?
        /// Information about the association.
        public let overview: AssociationOverview?
        /// A cron expression that specifies a schedule when the association runs. The schedule runs in Coordinated Universal Time (UTC).
        public let scheduleExpression: String?
        /// Number of days to wait after the scheduled day to run an association.
        public let scheduleOffset: Int?
        /// A key-value mapping of document parameters to target resources. Both Targets and TargetMaps can't be specified together.
        public let targetMaps: [[String: [String]]]?
        /// The managed nodes targeted by the request to create an association. You can target all managed nodes in an Amazon Web Services account by specifying the InstanceIds key with a value of *.
        public let targets: [Target]?

        @inlinable
        public init(associationId: String? = nil, associationName: String? = nil, associationVersion: String? = nil, documentVersion: String? = nil, duration: Int? = nil, instanceId: String? = nil, lastExecutionDate: Date? = nil, name: String? = nil, overview: AssociationOverview? = nil, scheduleExpression: String? = nil, scheduleOffset: Int? = nil, targetMaps: [[String: [String]]]? = nil, targets: [Target]? = nil) {
            self.associationId = associationId
            self.associationName = associationName
            self.associationVersion = associationVersion
            self.documentVersion = documentVersion
            self.duration = duration
            self.instanceId = instanceId
            self.lastExecutionDate = lastExecutionDate
            self.name = name
            self.overview = overview
            self.scheduleExpression = scheduleExpression
            self.scheduleOffset = scheduleOffset
            self.targetMaps = targetMaps
            self.targets = targets
        }

        private enum CodingKeys: String, CodingKey {
            case associationId = "AssociationId"
            case associationName = "AssociationName"
            case associationVersion = "AssociationVersion"
            case documentVersion = "DocumentVersion"
            case duration = "Duration"
            case instanceId = "InstanceId"
            case lastExecutionDate = "LastExecutionDate"
            case name = "Name"
            case overview = "Overview"
            case scheduleExpression = "ScheduleExpression"
            case scheduleOffset = "ScheduleOffset"
            case targetMaps = "TargetMaps"
            case targets = "Targets"
        }
    }

    public struct AssociationDescription: AWSDecodableShape {
        public let alarmConfiguration: AlarmConfiguration?
        /// By default, when you create a new associations, the system runs it immediately after it is created and then according to the schedule you specified. Specify this option if you don't want an association to run immediately after you create it. This parameter isn't supported for rate expressions.
        public let applyOnlyAtCronInterval: Bool?
        /// The association ID.
        public let associationId: String?
        /// The association name.
        public let associationName: String?
        /// The association version.
        public let associationVersion: String?
        /// Choose the parameter that will define how your automation will branch out. This target is required for associations that use an Automation runbook and target resources by using rate controls. Automation is a tool in Amazon Web Services Systems Manager.
        public let automationTargetParameterName: String?
        /// The names or Amazon Resource Names (ARNs) of the Change Calendar type documents your associations are gated under. The associations only run when that change calendar is open. For more information, see Amazon Web Services Systems Manager Change Calendar in the Amazon Web Services Systems Manager User Guide.
        public let calendarNames: [String]?
        /// The severity level that is assigned to the association.
        public let complianceSeverity: AssociationComplianceSeverity?
        /// The date when the association was made.
        public let date: Date?
        /// The document version.
        public let documentVersion: String?
        /// The number of hours that an association can run on specified targets. After the resulting cutoff time passes, associations that are currently running are cancelled, and no pending executions are started on remaining targets.
        public let duration: Int?
        /// The managed node ID.
        public let instanceId: String?
        /// The date on which the association was last run.
        public let lastExecutionDate: Date?
        /// The last date on which the association was successfully run.
        public let lastSuccessfulExecutionDate: Date?
        /// The date when the association was last updated.
        public let lastUpdateAssociationDate: Date?
        /// The maximum number of targets allowed to run the association at the same time. You can specify a number, for example 10, or a percentage of the target set, for example 10%. The default value is 100%, which means all targets run the association at the same time. If a new managed node starts and attempts to run an association while Systems Manager is running MaxConcurrency associations, the association is allowed to run. During the next association interval, the new managed node will process its association within the limit specified for MaxConcurrency.
        public let maxConcurrency: String?
        /// The number of errors that are allowed before the system stops sending requests to run the association on additional targets. You can specify either an absolute number of errors, for example 10, or a percentage of the target set, for example 10%. If you specify 3, for example, the system stops sending requests when the fourth error is received. If you specify 0, then the system stops sending requests after the first error is returned. If you run an association on 50 managed nodes and set MaxError to 10%, then the system stops sending the request when the sixth error is received. Executions that are already running an association when MaxErrors is reached are allowed to complete, but some of these executions may fail as well. If you need to ensure that there won't be more than max-errors failed executions, set MaxConcurrency to 1 so that executions proceed one at a time.
        public let maxErrors: String?
        /// The name of the SSM document.
        public let name: String?
        /// An S3 bucket where you want to store the output details of the request.
        public let outputLocation: InstanceAssociationOutputLocation?
        /// Information about the association.
        public let overview: AssociationOverview?
        /// A description of the parameters for a document.
        public let parameters: [String: [String]]?
        /// A cron expression that specifies a schedule when the association runs.
        public let scheduleExpression: String?
        /// Number of days to wait after the scheduled day to run an association.
        public let scheduleOffset: Int?
        /// The association status.
        public let status: AssociationStatus?
        /// The mode for generating association compliance. You can specify AUTO or MANUAL. In AUTO mode, the system uses the status of the association execution to determine the compliance status. If the association execution runs successfully, then the association is COMPLIANT. If the association execution doesn't run successfully, the association is NON-COMPLIANT. In MANUAL mode, you must specify the AssociationId as a parameter for the PutComplianceItems API operation. In this case, compliance data isn't managed by State Manager, a tool in Amazon Web Services Systems Manager. It is managed by your direct call to the PutComplianceItems API operation. By default, all associations use AUTO mode.
        public let syncCompliance: AssociationSyncCompliance?
        /// The combination of Amazon Web Services Regions and Amazon Web Services accounts where you want to run the association.
        public let targetLocations: [TargetLocation]?
        /// A key-value mapping of document parameters to target resources. Both Targets and TargetMaps can't be specified together.
        public let targetMaps: [[String: [String]]]?
        /// The managed nodes targeted by the request.
        public let targets: [Target]?
        /// The CloudWatch alarm that was invoked during the association.
        public let triggeredAlarms: [AlarmStateInformation]?

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, applyOnlyAtCronInterval: Bool? = nil, associationId: String? = nil, associationName: String? = nil, associationVersion: String? = nil, automationTargetParameterName: String? = nil, calendarNames: [String]? = nil, complianceSeverity: AssociationComplianceSeverity? = nil, date: Date? = nil, documentVersion: String? = nil, duration: Int? = nil, instanceId: String? = nil, lastExecutionDate: Date? = nil, lastSuccessfulExecutionDate: Date? = nil, lastUpdateAssociationDate: Date? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, name: String? = nil, outputLocation: InstanceAssociationOutputLocation? = nil, overview: AssociationOverview? = nil, parameters: [String: [String]]? = nil, scheduleExpression: String? = nil, scheduleOffset: Int? = nil, status: AssociationStatus? = nil, syncCompliance: AssociationSyncCompliance? = nil, targetLocations: [TargetLocation]? = nil, targetMaps: [[String: [String]]]? = nil, targets: [Target]? = nil, triggeredAlarms: [AlarmStateInformation]? = nil) {
            self.alarmConfiguration = alarmConfiguration
            self.applyOnlyAtCronInterval = applyOnlyAtCronInterval
            self.associationId = associationId
            self.associationName = associationName
            self.associationVersion = associationVersion
            self.automationTargetParameterName = automationTargetParameterName
            self.calendarNames = calendarNames
            self.complianceSeverity = complianceSeverity
            self.date = date
            self.documentVersion = documentVersion
            self.duration = duration
            self.instanceId = instanceId
            self.lastExecutionDate = lastExecutionDate
            self.lastSuccessfulExecutionDate = lastSuccessfulExecutionDate
            self.lastUpdateAssociationDate = lastUpdateAssociationDate
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.name = name
            self.outputLocation = outputLocation
            self.overview = overview
            self.parameters = parameters
            self.scheduleExpression = scheduleExpression
            self.scheduleOffset = scheduleOffset
            self.status = status
            self.syncCompliance = syncCompliance
            self.targetLocations = targetLocations
            self.targetMaps = targetMaps
            self.targets = targets
            self.triggeredAlarms = triggeredAlarms
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case applyOnlyAtCronInterval = "ApplyOnlyAtCronInterval"
            case associationId = "AssociationId"
            case associationName = "AssociationName"
            case associationVersion = "AssociationVersion"
            case automationTargetParameterName = "AutomationTargetParameterName"
            case calendarNames = "CalendarNames"
            case complianceSeverity = "ComplianceSeverity"
            case date = "Date"
            case documentVersion = "DocumentVersion"
            case duration = "Duration"
            case instanceId = "InstanceId"
            case lastExecutionDate = "LastExecutionDate"
            case lastSuccessfulExecutionDate = "LastSuccessfulExecutionDate"
            case lastUpdateAssociationDate = "LastUpdateAssociationDate"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case name = "Name"
            case outputLocation = "OutputLocation"
            case overview = "Overview"
            case parameters = "Parameters"
            case scheduleExpression = "ScheduleExpression"
            case scheduleOffset = "ScheduleOffset"
            case status = "Status"
            case syncCompliance = "SyncCompliance"
            case targetLocations = "TargetLocations"
            case targetMaps = "TargetMaps"
            case targets = "Targets"
            case triggeredAlarms = "TriggeredAlarms"
        }
    }

    public struct AssociationExecution: AWSDecodableShape {
        public let alarmConfiguration: AlarmConfiguration?
        /// The association ID.
        public let associationId: String?
        /// The association version.
        public let associationVersion: String?
        /// The time the execution started.
        public let createdTime: Date?
        /// Detailed status information about the execution.
        public let detailedStatus: String?
        /// The execution ID for the association.
        public let executionId: String?
        /// The date of the last execution.
        public let lastExecutionDate: Date?
        /// An aggregate status of the resources in the execution based on the status type.
        public let resourceCountByStatus: String?
        /// The status of the association execution.
        public let status: String?
        /// The CloudWatch alarms that were invoked by the association.
        public let triggeredAlarms: [AlarmStateInformation]?

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, associationId: String? = nil, associationVersion: String? = nil, createdTime: Date? = nil, detailedStatus: String? = nil, executionId: String? = nil, lastExecutionDate: Date? = nil, resourceCountByStatus: String? = nil, status: String? = nil, triggeredAlarms: [AlarmStateInformation]? = nil) {
            self.alarmConfiguration = alarmConfiguration
            self.associationId = associationId
            self.associationVersion = associationVersion
            self.createdTime = createdTime
            self.detailedStatus = detailedStatus
            self.executionId = executionId
            self.lastExecutionDate = lastExecutionDate
            self.resourceCountByStatus = resourceCountByStatus
            self.status = status
            self.triggeredAlarms = triggeredAlarms
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case associationId = "AssociationId"
            case associationVersion = "AssociationVersion"
            case createdTime = "CreatedTime"
            case detailedStatus = "DetailedStatus"
            case executionId = "ExecutionId"
            case lastExecutionDate = "LastExecutionDate"
            case resourceCountByStatus = "ResourceCountByStatus"
            case status = "Status"
            case triggeredAlarms = "TriggeredAlarms"
        }
    }

    public struct AssociationExecutionFilter: AWSEncodableShape {
        /// The key value used in the request.
        public let key: AssociationExecutionFilterKey
        /// The filter type specified in the request.
        public let type: AssociationFilterOperatorType
        /// The value specified for the key.
        public let value: String

        @inlinable
        public init(key: AssociationExecutionFilterKey, type: AssociationFilterOperatorType, value: String) {
            self.key = key
            self.type = type
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.value, name: "value", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case type = "Type"
            case value = "Value"
        }
    }

    public struct AssociationExecutionTarget: AWSDecodableShape {
        /// The association ID.
        public let associationId: String?
        /// The association version.
        public let associationVersion: String?
        /// Detailed information about the execution status.
        public let detailedStatus: String?
        /// The execution ID.
        public let executionId: String?
        /// The date of the last execution.
        public let lastExecutionDate: Date?
        /// The location where the association details are saved.
        public let outputSource: OutputSource?
        /// The resource ID, for example, the managed node ID where the association ran.
        public let resourceId: String?
        /// The resource type, for example, EC2.
        public let resourceType: String?
        /// The association execution status.
        public let status: String?

        @inlinable
        public init(associationId: String? = nil, associationVersion: String? = nil, detailedStatus: String? = nil, executionId: String? = nil, lastExecutionDate: Date? = nil, outputSource: OutputSource? = nil, resourceId: String? = nil, resourceType: String? = nil, status: String? = nil) {
            self.associationId = associationId
            self.associationVersion = associationVersion
            self.detailedStatus = detailedStatus
            self.executionId = executionId
            self.lastExecutionDate = lastExecutionDate
            self.outputSource = outputSource
            self.resourceId = resourceId
            self.resourceType = resourceType
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case associationId = "AssociationId"
            case associationVersion = "AssociationVersion"
            case detailedStatus = "DetailedStatus"
            case executionId = "ExecutionId"
            case lastExecutionDate = "LastExecutionDate"
            case outputSource = "OutputSource"
            case resourceId = "ResourceId"
            case resourceType = "ResourceType"
            case status = "Status"
        }
    }

    public struct AssociationExecutionTargetsFilter: AWSEncodableShape {
        /// The key value used in the request.
        public let key: AssociationExecutionTargetsFilterKey
        /// The value specified for the key.
        public let value: String

        @inlinable
        public init(key: AssociationExecutionTargetsFilterKey, value: String) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.value, name: "value", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct AssociationFilter: AWSEncodableShape {
        /// The name of the filter.   InstanceId has been deprecated.
        public let key: AssociationFilterKey
        /// The filter value.
        public let value: String

        @inlinable
        public init(key: AssociationFilterKey, value: String) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.value, name: "value", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "key"
            case value = "value"
        }
    }

    public struct AssociationOverview: AWSDecodableShape {
        /// Returns the number of targets for the association status. For example, if you created an association with two managed nodes, and one of them was successful, this would return the count of managed nodes by status.
        public let associationStatusAggregatedCount: [String: Int]?
        /// A detailed status of the association.
        public let detailedStatus: String?
        /// The status of the association. Status can be: Pending, Success, or Failed.
        public let status: String?

        @inlinable
        public init(associationStatusAggregatedCount: [String: Int]? = nil, detailedStatus: String? = nil, status: String? = nil) {
            self.associationStatusAggregatedCount = associationStatusAggregatedCount
            self.detailedStatus = detailedStatus
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case associationStatusAggregatedCount = "AssociationStatusAggregatedCount"
            case detailedStatus = "DetailedStatus"
            case status = "Status"
        }
    }

    public struct AssociationStatus: AWSEncodableShape & AWSDecodableShape {
        /// A user-defined string.
        public let additionalInfo: String?
        /// The date when the status changed.
        public let date: Date
        /// The reason for the status.
        public let message: String
        /// The status.
        public let name: AssociationStatusName

        @inlinable
        public init(additionalInfo: String? = nil, date: Date, message: String, name: AssociationStatusName) {
            self.additionalInfo = additionalInfo
            self.date = date
            self.message = message
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.additionalInfo, name: "additionalInfo", parent: name, max: 1024)
            try self.validate(self.message, name: "message", parent: name, max: 1024)
            try self.validate(self.message, name: "message", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case additionalInfo = "AdditionalInfo"
            case date = "Date"
            case message = "Message"
            case name = "Name"
        }
    }

    public struct AssociationVersionInfo: AWSDecodableShape {
        /// By default, when you create new associations, the system runs it immediately after it is created and then according to the schedule you specified. Specify this option if you don't want an association to run immediately after you create it. This parameter isn't supported for rate expressions.
        public let applyOnlyAtCronInterval: Bool?
        /// The ID created by the system when the association was created.
        public let associationId: String?
        /// The name specified for the association version when the association version was created.
        public let associationName: String?
        /// The association version.
        public let associationVersion: String?
        /// The names or Amazon Resource Names (ARNs) of the Change Calendar type documents your associations are gated under. The associations for this version only run when that Change Calendar is open. For more information, see Amazon Web Services Systems Manager Change Calendar in the Amazon Web Services Systems Manager User Guide.
        public let calendarNames: [String]?
        /// The severity level that is assigned to the association.
        public let complianceSeverity: AssociationComplianceSeverity?
        /// The date the association version was created.
        public let createdDate: Date?
        /// The version of an Amazon Web Services Systems Manager document (SSM document) used when the association version was created.
        public let documentVersion: String?
        /// The number of hours that an association can run on specified targets. After the resulting cutoff time passes, associations that are currently running are cancelled, and no pending executions are started on remaining targets.
        public let duration: Int?
        /// The maximum number of targets allowed to run the association at the same time. You can specify a number, for example 10, or a percentage of the target set, for example 10%. The default value is 100%, which means all targets run the association at the same time. If a new managed node starts and attempts to run an association while Systems Manager is running MaxConcurrency associations, the association is allowed to run. During the next association interval, the new managed node will process its association within the limit specified for MaxConcurrency.
        public let maxConcurrency: String?
        /// The number of errors that are allowed before the system stops sending requests to run the association on additional targets. You can specify either an absolute number of errors, for example 10, or a percentage of the target set, for example 10%. If you specify 3, for example, the system stops sending requests when the fourth error is received. If you specify 0, then the system stops sending requests after the first error is returned. If you run an association on 50 managed nodes and set MaxError to 10%, then the system stops sending the request when the sixth error is received. Executions that are already running an association when MaxErrors is reached are allowed to complete, but some of these executions may fail as well. If you need to ensure that there won't be more than max-errors failed executions, set MaxConcurrency to 1 so that executions proceed one at a time.
        public let maxErrors: String?
        /// The name specified when the association was created.
        public let name: String?
        /// The location in Amazon S3 specified for the association when the association version was created.
        public let outputLocation: InstanceAssociationOutputLocation?
        /// Parameters specified when the association version was created.
        public let parameters: [String: [String]]?
        /// The cron or rate schedule specified for the association when the association version was created.
        public let scheduleExpression: String?
        /// Number of days to wait after the scheduled day to run an association.
        public let scheduleOffset: Int?
        /// The mode for generating association compliance. You can specify AUTO or MANUAL. In AUTO mode, the system uses the status of the association execution to determine the compliance status. If the association execution runs successfully, then the association is COMPLIANT. If the association execution doesn't run successfully, the association is NON-COMPLIANT. In MANUAL mode, you must specify the AssociationId as a parameter for the PutComplianceItems API operation. In this case, compliance data isn't managed by State Manager, a tool in Amazon Web Services Systems Manager. It is managed by your direct call to the PutComplianceItems API operation. By default, all associations use AUTO mode.
        public let syncCompliance: AssociationSyncCompliance?
        /// The combination of Amazon Web Services Regions and Amazon Web Services accounts where you wanted to run the association when this association version was created.
        public let targetLocations: [TargetLocation]?
        /// A key-value mapping of document parameters to target resources. Both Targets and TargetMaps can't be specified together.
        public let targetMaps: [[String: [String]]]?
        /// The targets specified for the association when the association version was created.
        public let targets: [Target]?

        @inlinable
        public init(applyOnlyAtCronInterval: Bool? = nil, associationId: String? = nil, associationName: String? = nil, associationVersion: String? = nil, calendarNames: [String]? = nil, complianceSeverity: AssociationComplianceSeverity? = nil, createdDate: Date? = nil, documentVersion: String? = nil, duration: Int? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, name: String? = nil, outputLocation: InstanceAssociationOutputLocation? = nil, parameters: [String: [String]]? = nil, scheduleExpression: String? = nil, scheduleOffset: Int? = nil, syncCompliance: AssociationSyncCompliance? = nil, targetLocations: [TargetLocation]? = nil, targetMaps: [[String: [String]]]? = nil, targets: [Target]? = nil) {
            self.applyOnlyAtCronInterval = applyOnlyAtCronInterval
            self.associationId = associationId
            self.associationName = associationName
            self.associationVersion = associationVersion
            self.calendarNames = calendarNames
            self.complianceSeverity = complianceSeverity
            self.createdDate = createdDate
            self.documentVersion = documentVersion
            self.duration = duration
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.name = name
            self.outputLocation = outputLocation
            self.parameters = parameters
            self.scheduleExpression = scheduleExpression
            self.scheduleOffset = scheduleOffset
            self.syncCompliance = syncCompliance
            self.targetLocations = targetLocations
            self.targetMaps = targetMaps
            self.targets = targets
        }

        private enum CodingKeys: String, CodingKey {
            case applyOnlyAtCronInterval = "ApplyOnlyAtCronInterval"
            case associationId = "AssociationId"
            case associationName = "AssociationName"
            case associationVersion = "AssociationVersion"
            case calendarNames = "CalendarNames"
            case complianceSeverity = "ComplianceSeverity"
            case createdDate = "CreatedDate"
            case documentVersion = "DocumentVersion"
            case duration = "Duration"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case name = "Name"
            case outputLocation = "OutputLocation"
            case parameters = "Parameters"
            case scheduleExpression = "ScheduleExpression"
            case scheduleOffset = "ScheduleOffset"
            case syncCompliance = "SyncCompliance"
            case targetLocations = "TargetLocations"
            case targetMaps = "TargetMaps"
            case targets = "Targets"
        }
    }

    public struct AttachmentContent: AWSDecodableShape {
        /// The cryptographic hash value of the document content.
        public let hash: String?
        /// The hash algorithm used to calculate the hash value.
        public let hashType: AttachmentHashType?
        /// The name of an attachment.
        public let name: String?
        /// The size of an attachment in bytes.
        public let size: Int64?
        /// The URL location of the attachment content.
        public let url: String?

        @inlinable
        public init(hash: String? = nil, hashType: AttachmentHashType? = nil, name: String? = nil, size: Int64? = nil, url: String? = nil) {
            self.hash = hash
            self.hashType = hashType
            self.name = name
            self.size = size
            self.url = url
        }

        private enum CodingKeys: String, CodingKey {
            case hash = "Hash"
            case hashType = "HashType"
            case name = "Name"
            case size = "Size"
            case url = "Url"
        }
    }

    public struct AttachmentInformation: AWSDecodableShape {
        /// The name of the attachment.
        public let name: String?

        @inlinable
        public init(name: String? = nil) {
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
        }
    }

    public struct AttachmentsSource: AWSEncodableShape {
        /// The key of a key-value pair that identifies the location of an attachment to a document.
        public let key: AttachmentsSourceKey?
        /// The name of the document attachment file.
        public let name: String?
        /// The value of a key-value pair that identifies the location of an attachment to a document. The format for Value depends on the type of key you specify.   For the key SourceUrl, the value is an S3 bucket location. For example:  "Values": [ "s3://amzn-s3-demo-bucket/my-prefix" ]    For the key S3FileUrl, the value is a file in an S3 bucket. For example:  "Values": [ "s3://amzn-s3-demo-bucket/my-prefix/my-file.py" ]    For the key AttachmentReference, the value is constructed from the name of another SSM document in your account, a version number of that document, and a file attached to that document version that you want to reuse. For example:  "Values": [ "MyOtherDocument/3/my-other-file.py" ]  However, if the SSM document is shared with you from another account, the full SSM document ARN must be specified instead of the document name only. For example:  "Values": [ "arn:aws:ssm:us-east-2:111122223333:document/OtherAccountDocument/3/their-file.py" ]
        public let values: [String]?

        @inlinable
        public init(key: AttachmentsSourceKey? = nil, name: String? = nil, values: [String]? = nil) {
            self.key = key
            self.name = name
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.values?.forEach {
                try validate($0, name: "values[]", parent: name, max: 1024)
                try validate($0, name: "values[]", parent: name, min: 1)
            }
            try self.validate(self.values, name: "values", parent: name, max: 1)
            try self.validate(self.values, name: "values", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case name = "Name"
            case values = "Values"
        }
    }

    public struct AutomationExecution: AWSDecodableShape {
        /// The details for the CloudWatch alarm applied to your automation.
        public let alarmConfiguration: AlarmConfiguration?
        /// The ID of a State Manager association used in the Automation operation.
        public let associationId: String?
        /// The execution ID.
        public let automationExecutionId: String?
        /// The execution status of the Automation.
        public let automationExecutionStatus: AutomationExecutionStatus?
        /// The subtype of the Automation operation. Currently, the only supported value is ChangeRequest.
        public let automationSubtype: AutomationSubtype?
        /// The name of the Change Manager change request.
        public let changeRequestName: String?
        /// The action of the step that is currently running.
        public let currentAction: String?
        /// The name of the step that is currently running.
        public let currentStepName: String?
        /// The name of the Automation runbook used during the execution.
        public let documentName: String?
        /// The version of the document to use during execution.
        public let documentVersion: String?
        /// The Amazon Resource Name (ARN) of the user who ran the automation.
        public let executedBy: String?
        /// The time the execution finished.
        public let executionEndTime: Date?
        /// The time the execution started.
        public let executionStartTime: Date?
        /// A message describing why an execution has failed, if the status is set to Failed.
        public let failureMessage: String?
        /// The MaxConcurrency value specified by the user when the execution started.
        public let maxConcurrency: String?
        /// The MaxErrors value specified by the user when the execution started.
        public let maxErrors: String?
        /// The automation execution mode.
        public let mode: ExecutionMode?
        /// The ID of an OpsItem that is created to represent a Change Manager change request.
        public let opsItemId: String?
        /// The list of execution outputs as defined in the Automation runbook.
        public let outputs: [String: [String]]?
        /// The key-value map of execution parameters, which were supplied when calling StartAutomationExecution.
        public let parameters: [String: [String]]?
        /// The AutomationExecutionId of the parent automation.
        public let parentAutomationExecutionId: String?
        /// An aggregate of step execution statuses displayed in the Amazon Web Services Systems Manager console for a multi-Region and multi-account Automation execution.
        public let progressCounters: ProgressCounters?
        /// A list of resolved targets in the rate control execution.
        public let resolvedTargets: ResolvedTargets?
        /// Information about the Automation runbooks that are run as part of a runbook workflow.  The Automation runbooks specified for the runbook workflow can't run until all required approvals for the change request have been received.
        public let runbooks: [Runbook]?
        /// The date and time the Automation operation is scheduled to start.
        public let scheduledTime: Date?
        /// A list of details about the current state of all steps that comprise an execution. An Automation runbook contains a list of steps that are run in order.
        public let stepExecutions: [StepExecution]?
        /// A boolean value that indicates if the response contains the full list of the Automation step executions. If true, use the DescribeAutomationStepExecutions API operation to get the full list of step executions.
        public let stepExecutionsTruncated: Bool?
        /// The target of the execution.
        public let target: String?
        /// The combination of Amazon Web Services Regions and/or Amazon Web Services accounts where you want to run the Automation.
        public let targetLocations: [TargetLocation]?
        /// A publicly accessible URL for a file that contains the TargetLocations body. Currently, only files in presigned Amazon S3 buckets are supported
        public let targetLocationsURL: String?
        /// The specified key-value mapping of document parameters to target resources.
        public let targetMaps: [[String: [String]]]?
        /// The parameter name.
        public let targetParameterName: String?
        /// The specified targets.
        public let targets: [Target]?
        /// The CloudWatch alarm that was invoked by the automation.
        public let triggeredAlarms: [AlarmStateInformation]?
        /// Variables defined for the automation.
        public let variables: [String: [String]]?

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, associationId: String? = nil, automationExecutionId: String? = nil, automationExecutionStatus: AutomationExecutionStatus? = nil, automationSubtype: AutomationSubtype? = nil, changeRequestName: String? = nil, currentAction: String? = nil, currentStepName: String? = nil, documentName: String? = nil, documentVersion: String? = nil, executedBy: String? = nil, executionEndTime: Date? = nil, executionStartTime: Date? = nil, failureMessage: String? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, mode: ExecutionMode? = nil, opsItemId: String? = nil, outputs: [String: [String]]? = nil, parameters: [String: [String]]? = nil, parentAutomationExecutionId: String? = nil, progressCounters: ProgressCounters? = nil, resolvedTargets: ResolvedTargets? = nil, runbooks: [Runbook]? = nil, scheduledTime: Date? = nil, stepExecutions: [StepExecution]? = nil, stepExecutionsTruncated: Bool? = nil, target: String? = nil, targetLocations: [TargetLocation]? = nil, targetLocationsURL: String? = nil, targetMaps: [[String: [String]]]? = nil, targetParameterName: String? = nil, targets: [Target]? = nil, triggeredAlarms: [AlarmStateInformation]? = nil, variables: [String: [String]]? = nil) {
            self.alarmConfiguration = alarmConfiguration
            self.associationId = associationId
            self.automationExecutionId = automationExecutionId
            self.automationExecutionStatus = automationExecutionStatus
            self.automationSubtype = automationSubtype
            self.changeRequestName = changeRequestName
            self.currentAction = currentAction
            self.currentStepName = currentStepName
            self.documentName = documentName
            self.documentVersion = documentVersion
            self.executedBy = executedBy
            self.executionEndTime = executionEndTime
            self.executionStartTime = executionStartTime
            self.failureMessage = failureMessage
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.mode = mode
            self.opsItemId = opsItemId
            self.outputs = outputs
            self.parameters = parameters
            self.parentAutomationExecutionId = parentAutomationExecutionId
            self.progressCounters = progressCounters
            self.resolvedTargets = resolvedTargets
            self.runbooks = runbooks
            self.scheduledTime = scheduledTime
            self.stepExecutions = stepExecutions
            self.stepExecutionsTruncated = stepExecutionsTruncated
            self.target = target
            self.targetLocations = targetLocations
            self.targetLocationsURL = targetLocationsURL
            self.targetMaps = targetMaps
            self.targetParameterName = targetParameterName
            self.targets = targets
            self.triggeredAlarms = triggeredAlarms
            self.variables = variables
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case associationId = "AssociationId"
            case automationExecutionId = "AutomationExecutionId"
            case automationExecutionStatus = "AutomationExecutionStatus"
            case automationSubtype = "AutomationSubtype"
            case changeRequestName = "ChangeRequestName"
            case currentAction = "CurrentAction"
            case currentStepName = "CurrentStepName"
            case documentName = "DocumentName"
            case documentVersion = "DocumentVersion"
            case executedBy = "ExecutedBy"
            case executionEndTime = "ExecutionEndTime"
            case executionStartTime = "ExecutionStartTime"
            case failureMessage = "FailureMessage"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case mode = "Mode"
            case opsItemId = "OpsItemId"
            case outputs = "Outputs"
            case parameters = "Parameters"
            case parentAutomationExecutionId = "ParentAutomationExecutionId"
            case progressCounters = "ProgressCounters"
            case resolvedTargets = "ResolvedTargets"
            case runbooks = "Runbooks"
            case scheduledTime = "ScheduledTime"
            case stepExecutions = "StepExecutions"
            case stepExecutionsTruncated = "StepExecutionsTruncated"
            case target = "Target"
            case targetLocations = "TargetLocations"
            case targetLocationsURL = "TargetLocationsURL"
            case targetMaps = "TargetMaps"
            case targetParameterName = "TargetParameterName"
            case targets = "Targets"
            case triggeredAlarms = "TriggeredAlarms"
            case variables = "Variables"
        }
    }

    public struct AutomationExecutionFilter: AWSEncodableShape {
        /// One or more keys to limit the results.
        public let key: AutomationExecutionFilterKey
        /// The values used to limit the execution information associated with the filter's key.
        public let values: [String]

        @inlinable
        public init(key: AutomationExecutionFilterKey, values: [String]) {
            self.key = key
            self.values = values
        }

        public func validate(name: String) throws {
            try self.values.forEach {
                try validate($0, name: "values[]", parent: name, max: 150)
                try validate($0, name: "values[]", parent: name, min: 1)
            }
            try self.validate(self.values, name: "values", parent: name, max: 10)
            try self.validate(self.values, name: "values", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case values = "Values"
        }
    }

    public struct AutomationExecutionInputs: AWSEncodableShape {
        /// Information about parameters that can be specified for the preview operation.
        public let parameters: [String: [String]]?
        /// Information about the Amazon Web Services Regions and Amazon Web Services accounts targeted by the Automation execution preview operation.
        public let targetLocations: [TargetLocation]?
        /// A publicly accessible URL for a file that contains the TargetLocations body. Currently, only files in presigned Amazon S3 buckets are supported.
        public let targetLocationsURL: String?
        /// A key-value mapping of document parameters to target resources. Both Targets and TargetMaps can't be specified together.
        public let targetMaps: [[String: [String]]]?
        /// The name of the parameter used as the target resource for the rate-controlled execution. Required if you specify targets.
        public let targetParameterName: String?
        /// Information about the resources that would be included in the actual runbook execution, if it were to be run. Both Targets and TargetMaps can't be specified together.
        public let targets: [Target]?

        @inlinable
        public init(parameters: [String: [String]]? = nil, targetLocations: [TargetLocation]? = nil, targetLocationsURL: String? = nil, targetMaps: [[String: [String]]]? = nil, targetParameterName: String? = nil, targets: [Target]? = nil) {
            self.parameters = parameters
            self.targetLocations = targetLocations
            self.targetLocationsURL = targetLocationsURL
            self.targetMaps = targetMaps
            self.targetParameterName = targetParameterName
            self.targets = targets
        }

        public func validate(name: String) throws {
            try self.parameters?.forEach {
                try validate($0.key, name: "parameters.key", parent: name, max: 50)
                try validate($0.key, name: "parameters.key", parent: name, min: 1)
                try validate($0.value, name: "parameters[\"\($0.key)\"]", parent: name, max: 50)
            }
            try self.validate(self.parameters, name: "parameters", parent: name, max: 200)
            try self.validate(self.parameters, name: "parameters", parent: name, min: 1)
            try self.targetLocations?.forEach {
                try $0.validate(name: "\(name).targetLocations[]")
            }
            try self.validate(self.targetLocations, name: "targetLocations", parent: name, max: 100)
            try self.validate(self.targetLocations, name: "targetLocations", parent: name, min: 1)
            try self.validate(self.targetLocationsURL, name: "targetLocationsURL", parent: name, pattern: "^https:\\/\\/[-a-zA-Z0-9@:%._\\+~#=]{1,253}\\.s3(\\.[a-z\\d-]{9,16})?\\.amazonaws\\.com\\/.{1,2000}$")
            try self.targetMaps?.forEach {
                try validate($0, name: "targetMaps[]", parent: name, max: 20)
                try validate($0, name: "targetMaps[]", parent: name, min: 1)
            }
            try self.validate(self.targetMaps, name: "targetMaps", parent: name, max: 300)
            try self.validate(self.targetParameterName, name: "targetParameterName", parent: name, max: 50)
            try self.validate(self.targetParameterName, name: "targetParameterName", parent: name, min: 1)
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
            try self.validate(self.targets, name: "targets", parent: name, max: 5)
        }

        private enum CodingKeys: String, CodingKey {
            case parameters = "Parameters"
            case targetLocations = "TargetLocations"
            case targetLocationsURL = "TargetLocationsURL"
            case targetMaps = "TargetMaps"
            case targetParameterName = "TargetParameterName"
            case targets = "Targets"
        }
    }

    public struct AutomationExecutionMetadata: AWSDecodableShape {
        /// The details for the CloudWatch alarm applied to your automation.
        public let alarmConfiguration: AlarmConfiguration?
        /// The ID of a State Manager association used in the Automation operation.
        public let associationId: String?
        /// The execution ID.
        public let automationExecutionId: String?
        /// The status of the execution.
        public let automationExecutionStatus: AutomationExecutionStatus?
        /// The subtype of the Automation operation. Currently, the only supported value is ChangeRequest.
        public let automationSubtype: AutomationSubtype?
        /// Use this filter with DescribeAutomationExecutions. Specify either Local or CrossAccount. CrossAccount is an Automation that runs in multiple Amazon Web Services Regions and Amazon Web Services accounts. For more information, see Running automations in multiple Amazon Web Services Regions and accounts in the Amazon Web Services Systems Manager User Guide.
        public let automationType: AutomationType?
        /// The name of the Change Manager change request.
        public let changeRequestName: String?
        /// The action of the step that is currently running.
        public let currentAction: String?
        /// The name of the step that is currently running.
        public let currentStepName: String?
        /// The name of the Automation runbook used during execution.
        public let documentName: String?
        /// The document version used during the execution.
        public let documentVersion: String?
        /// The IAM role ARN of the user who ran the automation.
        public let executedBy: String?
        /// The time the execution finished. This isn't populated if the execution is still in progress.
        public let executionEndTime: Date?
        /// The time the execution started.
        public let executionStartTime: Date?
        /// The list of execution outputs as defined in the Automation runbook.
        public let failureMessage: String?
        /// An S3 bucket where execution information is stored.
        public let logFile: String?
        /// The MaxConcurrency value specified by the user when starting the automation.
        public let maxConcurrency: String?
        /// The MaxErrors value specified by the user when starting the automation.
        public let maxErrors: String?
        /// The Automation execution mode.
        public let mode: ExecutionMode?
        /// The ID of an OpsItem that is created to represent a Change Manager change request.
        public let opsItemId: String?
        /// The list of execution outputs as defined in the Automation runbook.
        public let outputs: [String: [String]]?
        /// The execution ID of the parent automation.
        public let parentAutomationExecutionId: String?
        /// A list of targets that resolved during the execution.
        public let resolvedTargets: ResolvedTargets?
        /// Information about the Automation runbooks that are run during a runbook workflow in Change Manager.  The Automation runbooks specified for the runbook workflow can't run until all required approvals for the change request have been received.
        public let runbooks: [Runbook]?
        /// The date and time the Automation operation is scheduled to start.
        public let scheduledTime: Date?
        /// The list of execution outputs as defined in the Automation runbook.
        public let target: String?
        /// A publicly accessible URL for a file that contains the TargetLocations body. Currently, only files in presigned Amazon S3 buckets are supported
        public let targetLocationsURL: String?
        /// The specified key-value mapping of document parameters to target resources.
        public let targetMaps: [[String: [String]]]?
        /// The list of execution outputs as defined in the Automation runbook.
        public let targetParameterName: String?
        /// The targets defined by the user when starting the automation.
        public let targets: [Target]?
        /// The CloudWatch alarm that was invoked by the automation.
        public let triggeredAlarms: [AlarmStateInformation]?

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, associationId: String? = nil, automationExecutionId: String? = nil, automationExecutionStatus: AutomationExecutionStatus? = nil, automationSubtype: AutomationSubtype? = nil, automationType: AutomationType? = nil, changeRequestName: String? = nil, currentAction: String? = nil, currentStepName: String? = nil, documentName: String? = nil, documentVersion: String? = nil, executedBy: String? = nil, executionEndTime: Date? = nil, executionStartTime: Date? = nil, failureMessage: String? = nil, logFile: String? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, mode: ExecutionMode? = nil, opsItemId: String? = nil, outputs: [String: [String]]? = nil, parentAutomationExecutionId: String? = nil, resolvedTargets: ResolvedTargets? = nil, runbooks: [Runbook]? = nil, scheduledTime: Date? = nil, target: String? = nil, targetLocationsURL: String? = nil, targetMaps: [[String: [String]]]? = nil, targetParameterName: String? = nil, targets: [Target]? = nil, triggeredAlarms: [AlarmStateInformation]? = nil) {
            self.alarmConfiguration = alarmConfiguration
            self.associationId = associationId
            self.automationExecutionId = automationExecutionId
            self.automationExecutionStatus = automationExecutionStatus
            self.automationSubtype = automationSubtype
            self.automationType = automationType
            self.changeRequestName = changeRequestName
            self.currentAction = currentAction
            self.currentStepName = currentStepName
            self.documentName = documentName
            self.documentVersion = documentVersion
            self.executedBy = executedBy
            self.executionEndTime = executionEndTime
            self.executionStartTime = executionStartTime
            self.failureMessage = failureMessage
            self.logFile = logFile
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.mode = mode
            self.opsItemId = opsItemId
            self.outputs = outputs
            self.parentAutomationExecutionId = parentAutomationExecutionId
            self.resolvedTargets = resolvedTargets
            self.runbooks = runbooks
            self.scheduledTime = scheduledTime
            self.target = target
            self.targetLocationsURL = targetLocationsURL
            self.targetMaps = targetMaps
            self.targetParameterName = targetParameterName
            self.targets = targets
            self.triggeredAlarms = triggeredAlarms
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case associationId = "AssociationId"
            case automationExecutionId = "AutomationExecutionId"
            case automationExecutionStatus = "AutomationExecutionStatus"
            case automationSubtype = "AutomationSubtype"
            case automationType = "AutomationType"
            case changeRequestName = "ChangeRequestName"
            case currentAction = "CurrentAction"
            case currentStepName = "CurrentStepName"
            case documentName = "DocumentName"
            case documentVersion = "DocumentVersion"
            case executedBy = "ExecutedBy"
            case executionEndTime = "ExecutionEndTime"
            case executionStartTime = "ExecutionStartTime"
            case failureMessage = "FailureMessage"
            case logFile = "LogFile"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case mode = "Mode"
            case opsItemId = "OpsItemId"
            case outputs = "Outputs"
            case parentAutomationExecutionId = "ParentAutomationExecutionId"
            case resolvedTargets = "ResolvedTargets"
            case runbooks = "Runbooks"
            case scheduledTime = "ScheduledTime"
            case target = "Target"
            case targetLocationsURL = "TargetLocationsURL"
            case targetMaps = "TargetMaps"
            case targetParameterName = "TargetParameterName"
            case targets = "Targets"
            case triggeredAlarms = "TriggeredAlarms"
        }
    }

    public struct AutomationExecutionPreview: AWSDecodableShape {
        /// Information about the Amazon Web Services Regions targeted by the execution preview.
        public let regions: [String]?
        /// Information about the type of impact a runbook step would have on a resource.    Mutating: The runbook step would make changes to the targets through actions that create, modify, or delete resources.    Non_Mutating: The runbook step would retrieve data about resources but not make changes to them. This category generally includes Describe*, List*, Get*, and similar read-only API actions.    Undetermined: An undetermined step invokes executions performed by another orchestration service like Lambda, Step Functions, or Amazon Web Services Systems Manager Run Command. An undetermined step might also call a third-party API. Systems Manager Automation doesn't know the outcome of the orchestration processes or third-party API executions, so the results of the steps are undetermined.
        public let stepPreviews: [ImpactType: Int]?
        /// Information that provides a preview of what the impact of running the specified Automation runbook would be.
        public let targetPreviews: [TargetPreview]?
        /// Information about the Amazon Web Services accounts that were included in the execution preview.
        public let totalAccounts: Int?

        @inlinable
        public init(regions: [String]? = nil, stepPreviews: [ImpactType: Int]? = nil, targetPreviews: [TargetPreview]? = nil, totalAccounts: Int? = nil) {
            self.regions = regions
            self.stepPreviews = stepPreviews
            self.targetPreviews = targetPreviews
            self.totalAccounts = totalAccounts
        }

        private enum CodingKeys: String, CodingKey {
            case regions = "Regions"
            case stepPreviews = "StepPreviews"
            case targetPreviews = "TargetPreviews"
            case totalAccounts = "TotalAccounts"
        }
    }

    public struct BaselineOverride: AWSEncodableShape {
        public let approvalRules: PatchRuleGroup?
        /// A list of explicitly approved patches for the baseline. For information about accepted formats for lists of approved patches and rejected patches, see Package name formats for approved and rejected patch lists in the Amazon Web Services Systems Manager User Guide.
        public let approvedPatches: [String]?
        /// Defines the compliance level for approved patches. When an approved patch is reported as missing, this value describes the severity of the compliance violation.
        public let approvedPatchesComplianceLevel: PatchComplianceLevel?
        /// Indicates whether the list of approved patches includes non-security updates that should be applied to the managed nodes. The default value is false. Applies to Linux managed nodes only.
        public let approvedPatchesEnableNonSecurity: Bool?
        /// Indicates whether managed nodes for which there are available security-related patches that have not been approved by the baseline are being defined as COMPLIANT or NON_COMPLIANT. This option is specified when the CreatePatchBaseline or UpdatePatchBaseline commands are run. Applies to Windows Server managed nodes only.
        public let availableSecurityUpdatesComplianceStatus: PatchComplianceStatus?
        public let globalFilters: PatchFilterGroup?
        /// The operating system rule used by the patch baseline override.
        public let operatingSystem: OperatingSystem?
        /// A list of explicitly rejected patches for the baseline. For information about accepted formats for lists of approved patches and rejected patches, see Package name formats for approved and rejected patch lists in the Amazon Web Services Systems Manager User Guide.
        public let rejectedPatches: [String]?
        /// The action for Patch Manager to take on patches included in the RejectedPackages list. A patch can be allowed only if it is a dependency of another package, or blocked entirely along with packages that include it as a dependency.
        public let rejectedPatchesAction: PatchAction?
        /// Information about the patches to use to update the managed nodes, including target operating systems and source repositories. Applies to Linux managed nodes only.
        public let sources: [PatchSource]?

        @inlinable
        public init(approvalRules: PatchRuleGroup? = nil, approvedPatches: [String]? = nil, approvedPatchesComplianceLevel: PatchComplianceLevel? = nil, approvedPatchesEnableNonSecurity: Bool? = nil, availableSecurityUpdatesComplianceStatus: PatchComplianceStatus? = nil, globalFilters: PatchFilterGroup? = nil, operatingSystem: OperatingSystem? = nil, rejectedPatches: [String]? = nil, rejectedPatchesAction: PatchAction? = nil, sources: [PatchSource]? = nil) {
            self.approvalRules = approvalRules
            self.approvedPatches = approvedPatches
            self.approvedPatchesComplianceLevel = approvedPatchesComplianceLevel
            self.approvedPatchesEnableNonSecurity = approvedPatchesEnableNonSecurity
            self.availableSecurityUpdatesComplianceStatus = availableSecurityUpdatesComplianceStatus
            self.globalFilters = globalFilters
            self.operatingSystem = operatingSystem
            self.rejectedPatches = rejectedPatches
            self.rejectedPatchesAction = rejectedPatchesAction
            self.sources = sources
        }

        public func validate(name: String) throws {
            try self.approvalRules?.validate(name: "\(name).approvalRules")
            try self.approvedPatches?.forEach {
                try validate($0, name: "approvedPatches[]", parent: name, max: 100)
                try validate($0, name: "approvedPatches[]", parent: name, min: 1)
            }
            try self.validate(self.approvedPatches, name: "approvedPatches", parent: name, max: 50)
            try self.globalFilters?.validate(name: "\(name).globalFilters")
            try self.rejectedPatches?.forEach {
                try validate($0, name: "rejectedPatches[]", parent: name, max: 100)
                try validate($0, name: "rejectedPatches[]", parent: name, min: 1)
            }
            try self.validate(self.rejectedPatches, name: "rejectedPatches", parent: name, max: 50)
            try self.sources?.forEach {
                try $0.validate(name: "\(name).sources[]")
            }
            try self.validate(self.sources, name: "sources", parent: name, max: 20)
        }

        private enum CodingKeys: String, CodingKey {
            case approvalRules = "ApprovalRules"
            case approvedPatches = "ApprovedPatches"
            case approvedPatchesComplianceLevel = "ApprovedPatchesComplianceLevel"
            case approvedPatchesEnableNonSecurity = "ApprovedPatchesEnableNonSecurity"
            case availableSecurityUpdatesComplianceStatus = "AvailableSecurityUpdatesComplianceStatus"
            case globalFilters = "GlobalFilters"
            case operatingSystem = "OperatingSystem"
            case rejectedPatches = "RejectedPatches"
            case rejectedPatchesAction = "RejectedPatchesAction"
            case sources = "Sources"
        }
    }

    public struct CancelCommandRequest: AWSEncodableShape {
        /// The ID of the command you want to cancel.
        public let commandId: String
        /// (Optional) A list of managed node IDs on which you want to cancel the command. If not provided, the command is canceled on every node on which it was requested.
        public let instanceIds: [String]?

        @inlinable
        public init(commandId: String, instanceIds: [String]? = nil) {
            self.commandId = commandId
            self.instanceIds = instanceIds
        }

        public func validate(name: String) throws {
            try self.validate(self.commandId, name: "commandId", parent: name, max: 36)
            try self.validate(self.commandId, name: "commandId", parent: name, min: 36)
            try self.instanceIds?.forEach {
                try validate($0, name: "instanceIds[]", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            }
            try self.validate(self.instanceIds, name: "instanceIds", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case commandId = "CommandId"
            case instanceIds = "InstanceIds"
        }
    }

    public struct CancelCommandResult: AWSDecodableShape {
        public init() {}
    }

    public struct CancelMaintenanceWindowExecutionRequest: AWSEncodableShape {
        /// The ID of the maintenance window execution to stop.
        public let windowExecutionId: String

        @inlinable
        public init(windowExecutionId: String) {
            self.windowExecutionId = windowExecutionId
        }

        public func validate(name: String) throws {
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, max: 36)
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, min: 36)
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, pattern: "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case windowExecutionId = "WindowExecutionId"
        }
    }

    public struct CancelMaintenanceWindowExecutionResult: AWSDecodableShape {
        /// The ID of the maintenance window execution that has been stopped.
        public let windowExecutionId: String?

        @inlinable
        public init(windowExecutionId: String? = nil) {
            self.windowExecutionId = windowExecutionId
        }

        private enum CodingKeys: String, CodingKey {
            case windowExecutionId = "WindowExecutionId"
        }
    }

    public struct CloudWatchOutputConfig: AWSEncodableShape & AWSDecodableShape {
        /// The name of the CloudWatch Logs log group where you want to send command output. If you don't specify a group name, Amazon Web Services Systems Manager automatically creates a log group for you. The log group uses the following naming format:  aws/ssm/SystemsManagerDocumentName
        public let cloudWatchLogGroupName: String?
        /// Enables Systems Manager to send command output to CloudWatch Logs.
        public let cloudWatchOutputEnabled: Bool?

        @inlinable
        public init(cloudWatchLogGroupName: String? = nil, cloudWatchOutputEnabled: Bool? = nil) {
            self.cloudWatchLogGroupName = cloudWatchLogGroupName
            self.cloudWatchOutputEnabled = cloudWatchOutputEnabled
        }

        public func validate(name: String) throws {
            try self.validate(self.cloudWatchLogGroupName, name: "cloudWatchLogGroupName", parent: name, max: 512)
            try self.validate(self.cloudWatchLogGroupName, name: "cloudWatchLogGroupName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case cloudWatchLogGroupName = "CloudWatchLogGroupName"
            case cloudWatchOutputEnabled = "CloudWatchOutputEnabled"
        }
    }

    public struct Command: AWSDecodableShape {
        /// The details for the CloudWatch alarm applied to your command.
        public let alarmConfiguration: AlarmConfiguration?
        /// Amazon CloudWatch Logs information where you want Amazon Web Services Systems Manager to send the command output.
        public let cloudWatchOutputConfig: CloudWatchOutputConfig?
        /// A unique identifier for this command.
        public let commandId: String?
        /// User-specified information about the command, such as a brief description of what the command should do.
        public let comment: String?
        /// The number of targets for which the command invocation reached a terminal state. Terminal states include the following: Success, Failed, Execution Timed Out, Delivery Timed Out, Cancelled, Terminated, or Undeliverable.
        public let completedCount: Int?
        /// The number of targets for which the status is Delivery Timed Out.
        public let deliveryTimedOutCount: Int?
        /// The name of the document requested for execution.
        public let documentName: String?
        /// The Systems Manager document (SSM document) version.
        public let documentVersion: String?
        /// The number of targets for which the status is Failed or Execution Timed Out.
        public let errorCount: Int?
        /// If a command expires, it changes status to DeliveryTimedOut for all invocations that have the status InProgress, Pending, or Delayed. ExpiresAfter is calculated based on the total timeout for the overall command. For more information, see Understanding command timeout values in the Amazon Web Services Systems Manager User Guide.
        public let expiresAfter: Date?
        /// The managed node IDs against which this command was requested.
        public let instanceIds: [String]?
        /// The maximum number of managed nodes that are allowed to run the command at the same time. You can specify a number of managed nodes, such as 10, or a percentage of nodes, such as 10%. The default value is 50. For more information about how to use MaxConcurrency, see Amazon Web Services Systems Manager Run Command in the Amazon Web Services Systems Manager User Guide.
        public let maxConcurrency: String?
        /// The maximum number of errors allowed before the system stops sending the command to additional targets. You can specify a number of errors, such as 10, or a percentage or errors, such as 10%. The default value is 0. For more information about how to use MaxErrors, see Amazon Web Services Systems Manager Run Command in the Amazon Web Services Systems Manager User Guide.
        public let maxErrors: String?
        /// Configurations for sending notifications about command status changes.
        public let notificationConfig: NotificationConfig?
        /// The S3 bucket where the responses to the command executions should be stored. This was requested when issuing the command.
        public let outputS3BucketName: String?
        /// The S3 directory path inside the bucket where the responses to the command executions should be stored. This was requested when issuing the command.
        public let outputS3KeyPrefix: String?
        /// (Deprecated) You can no longer specify this parameter. The system ignores it. Instead, Systems Manager automatically determines the Amazon Web Services Region of the S3 bucket.
        public let outputS3Region: String?
        /// The parameter values to be inserted in the document when running the command.
        public let parameters: [String: [String]]?
        /// The date and time the command was requested.
        public let requestedDateTime: Date?
        /// The Identity and Access Management (IAM) service role that Run Command, a tool in Amazon Web Services Systems Manager, uses to act on your behalf when sending notifications about command status changes.
        public let serviceRole: String?
        /// The status of the command.
        public let status: CommandStatus?
        /// A detailed status of the command execution. StatusDetails includes more information than Status because it includes states resulting from error and concurrency control parameters. StatusDetails can show different results than Status. For more information about these statuses, see Understanding command statuses in the Amazon Web Services Systems Manager User Guide. StatusDetails can be one of the following values:   Pending: The command hasn't been sent to any managed nodes.   In Progress: The command has been sent to at least one managed node but hasn't reached a final state on all managed nodes.   Success: The command successfully ran on all invocations. This is a terminal state.   Delivery Timed Out: The value of MaxErrors or more command invocations shows a status of Delivery Timed Out. This is a terminal state.   Execution Timed Out: The value of MaxErrors or more command invocations shows a status of Execution Timed Out. This is a terminal state.   Failed: The value of MaxErrors or more command invocations shows a status of Failed. This is a terminal state.   Incomplete: The command was attempted on all managed nodes and one or more invocations doesn't have a value of Success but not enough invocations failed for the status to be Failed. This is a terminal state.   Cancelled: The command was terminated before it was completed. This is a terminal state.   Rate Exceeded: The number of managed nodes targeted by the command exceeded the account limit for pending invocations. The system has canceled the command before running it on any managed node. This is a terminal state.   Delayed: The system attempted to send the command to the managed node but wasn't successful. The system retries again.
        public let statusDetails: String?
        /// The number of targets for the command.
        public let targetCount: Int?
        /// An array of search criteria that targets managed nodes using a Key,Value combination that you specify. Targets is required if you don't provide one or more managed node IDs in the call.
        public let targets: [Target]?
        /// The TimeoutSeconds value specified for a command.
        public let timeoutSeconds: Int?
        /// The CloudWatch alarm that was invoked by the command.
        public let triggeredAlarms: [AlarmStateInformation]?

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, cloudWatchOutputConfig: CloudWatchOutputConfig? = nil, commandId: String? = nil, comment: String? = nil, completedCount: Int? = nil, deliveryTimedOutCount: Int? = nil, documentName: String? = nil, documentVersion: String? = nil, errorCount: Int? = nil, expiresAfter: Date? = nil, instanceIds: [String]? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, notificationConfig: NotificationConfig? = nil, outputS3BucketName: String? = nil, outputS3KeyPrefix: String? = nil, outputS3Region: String? = nil, parameters: [String: [String]]? = nil, requestedDateTime: Date? = nil, serviceRole: String? = nil, status: CommandStatus? = nil, statusDetails: String? = nil, targetCount: Int? = nil, targets: [Target]? = nil, timeoutSeconds: Int? = nil, triggeredAlarms: [AlarmStateInformation]? = nil) {
            self.alarmConfiguration = alarmConfiguration
            self.cloudWatchOutputConfig = cloudWatchOutputConfig
            self.commandId = commandId
            self.comment = comment
            self.completedCount = completedCount
            self.deliveryTimedOutCount = deliveryTimedOutCount
            self.documentName = documentName
            self.documentVersion = documentVersion
            self.errorCount = errorCount
            self.expiresAfter = expiresAfter
            self.instanceIds = instanceIds
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.notificationConfig = notificationConfig
            self.outputS3BucketName = outputS3BucketName
            self.outputS3KeyPrefix = outputS3KeyPrefix
            self.outputS3Region = outputS3Region
            self.parameters = parameters
            self.requestedDateTime = requestedDateTime
            self.serviceRole = serviceRole
            self.status = status
            self.statusDetails = statusDetails
            self.targetCount = targetCount
            self.targets = targets
            self.timeoutSeconds = timeoutSeconds
            self.triggeredAlarms = triggeredAlarms
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case cloudWatchOutputConfig = "CloudWatchOutputConfig"
            case commandId = "CommandId"
            case comment = "Comment"
            case completedCount = "CompletedCount"
            case deliveryTimedOutCount = "DeliveryTimedOutCount"
            case documentName = "DocumentName"
            case documentVersion = "DocumentVersion"
            case errorCount = "ErrorCount"
            case expiresAfter = "ExpiresAfter"
            case instanceIds = "InstanceIds"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case notificationConfig = "NotificationConfig"
            case outputS3BucketName = "OutputS3BucketName"
            case outputS3KeyPrefix = "OutputS3KeyPrefix"
            case outputS3Region = "OutputS3Region"
            case parameters = "Parameters"
            case requestedDateTime = "RequestedDateTime"
            case serviceRole = "ServiceRole"
            case status = "Status"
            case statusDetails = "StatusDetails"
            case targetCount = "TargetCount"
            case targets = "Targets"
            case timeoutSeconds = "TimeoutSeconds"
            case triggeredAlarms = "TriggeredAlarms"
        }
    }

    public struct CommandFilter: AWSEncodableShape {
        /// The name of the filter.  The ExecutionStage filter can't be used with the ListCommandInvocations operation, only with ListCommands.
        public let key: CommandFilterKey
        /// The filter value. Valid values for each filter key are as follows:    InvokedAfter: Specify a timestamp to limit your results. For example, specify 2024-07-07T00:00:00Z to see a list of command executions occurring July 7, 2021, and later.    InvokedBefore: Specify a timestamp to limit your results. For example, specify 2024-07-07T00:00:00Z to see a list of command executions from before July 7, 2021.    Status: Specify a valid command status to see a list of all command executions with that status. The status choices depend on the API you call. The status values you can specify for ListCommands are:    Pending     InProgress     Success     Cancelled     Failed     TimedOut (this includes both Delivery and Execution time outs)     AccessDenied     DeliveryTimedOut     ExecutionTimedOut     Incomplete     NoInstancesInTag     LimitExceeded    The status values you can specify for ListCommandInvocations are:    Pending     InProgress     Delayed     Success     Cancelled     Failed     TimedOut (this includes both Delivery and Execution time outs)     AccessDenied     DeliveryTimedOut     ExecutionTimedOut     Undeliverable     InvalidPlatform     Terminated       DocumentName: Specify name of the Amazon Web Services Systems Manager document (SSM document) for which you want to see command execution results. For example, specify AWS-RunPatchBaseline to see command executions that used this SSM document to perform security patching operations on managed nodes.     ExecutionStage: Specify one of the following values (ListCommands operations only):    Executing: Returns a list of command executions that are currently still running.    Complete: Returns a list of command executions that have already completed.
        public let value: String

        @inlinable
        public init(key: CommandFilterKey, value: String) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.value, name: "value", parent: name, max: 128)
            try self.validate(self.value, name: "value", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "key"
            case value = "value"
        }
    }

    public struct CommandInvocation: AWSDecodableShape {
        /// Amazon CloudWatch Logs information where you want Amazon Web Services Systems Manager to send the command output.
        public let cloudWatchOutputConfig: CloudWatchOutputConfig?
        /// The command against which this invocation was requested.
        public let commandId: String?
        /// Plugins processed by the command.
        public let commandPlugins: [CommandPlugin]?
        /// User-specified information about the command, such as a brief description of what the command should do.
        public let comment: String?
        /// The document name that was requested for execution.
        public let documentName: String?
        /// The Systems Manager document (SSM document) version.
        public let documentVersion: String?
        /// The managed node ID in which this invocation was requested.
        public let instanceId: String?
        /// The fully qualified host name of the managed node.
        public let instanceName: String?
        /// Configurations for sending notifications about command status changes on a per managed node basis.
        public let notificationConfig: NotificationConfig?
        /// The time and date the request was sent to this managed node.
        public let requestedDateTime: Date?
        /// The Identity and Access Management (IAM) service role that Run Command, a tool in Amazon Web Services Systems Manager, uses to act on your behalf when sending notifications about command status changes on a per managed node basis.
        public let serviceRole: String?
        /// The URL to the plugin's StdErr file in Amazon Simple Storage Service (Amazon S3), if the S3 bucket was defined for the parent command. For an invocation, StandardErrorUrl is populated if there is just one plugin defined for the command, and the S3 bucket was defined for the command.
        public let standardErrorUrl: String?
        /// The URL to the plugin's StdOut file in Amazon Simple Storage Service (Amazon S3), if the S3 bucket was defined for the parent command. For an invocation, StandardOutputUrl is populated if there is just one plugin defined for the command, and the S3 bucket was defined for the command.
        public let standardOutputUrl: String?
        /// Whether or not the invocation succeeded, failed, or is pending.
        public let status: CommandInvocationStatus?
        /// A detailed status of the command execution for each invocation (each managed node targeted by the command). StatusDetails includes more information than Status because it includes states resulting from error and concurrency control parameters. StatusDetails can show different results than Status. For more information about these statuses, see Understanding command statuses in the Amazon Web Services Systems Manager User Guide. StatusDetails can be one of the following values:   Pending: The command hasn't been sent to the managed node.   In Progress: The command has been sent to the managed node but hasn't reached a terminal state.   Success: The execution of the command or plugin was successfully completed. This is a terminal state.   Delivery Timed Out: The command wasn't delivered to the managed node before the delivery timeout expired. Delivery timeouts don't count against the parent command's MaxErrors limit, but they do contribute to whether the parent command status is Success or Incomplete. This is a terminal state.   Execution Timed Out: Command execution started on the managed node, but the execution wasn't complete before the execution timeout expired. Execution timeouts count against the MaxErrors limit of the parent command. This is a terminal state.   Failed: The command wasn't successful on the managed node. For a plugin, this indicates that the result code wasn't zero. For a command invocation, this indicates that the result code for one or more plugins wasn't zero. Invocation failures count against the MaxErrors limit of the parent command. This is a terminal state.   Cancelled: The command was terminated before it was completed. This is a terminal state.   Undeliverable: The command can't be delivered to the managed node. The managed node might not exist or might not be responding. Undeliverable invocations don't count against the parent command's MaxErrors limit and don't contribute to whether the parent command status is Success or Incomplete. This is a terminal state.   Terminated: The parent command exceeded its MaxErrors limit and subsequent command invocations were canceled by the system. This is a terminal state.   Delayed: The system attempted to send the command to the managed node but wasn't successful. The system retries again.
        public let statusDetails: String?
        ///  Gets the trace output sent by the agent.
        public let traceOutput: String?

        @inlinable
        public init(cloudWatchOutputConfig: CloudWatchOutputConfig? = nil, commandId: String? = nil, commandPlugins: [CommandPlugin]? = nil, comment: String? = nil, documentName: String? = nil, documentVersion: String? = nil, instanceId: String? = nil, instanceName: String? = nil, notificationConfig: NotificationConfig? = nil, requestedDateTime: Date? = nil, serviceRole: String? = nil, standardErrorUrl: String? = nil, standardOutputUrl: String? = nil, status: CommandInvocationStatus? = nil, statusDetails: String? = nil, traceOutput: String? = nil) {
            self.cloudWatchOutputConfig = cloudWatchOutputConfig
            self.commandId = commandId
            self.commandPlugins = commandPlugins
            self.comment = comment
            self.documentName = documentName
            self.documentVersion = documentVersion
            self.instanceId = instanceId
            self.instanceName = instanceName
            self.notificationConfig = notificationConfig
            self.requestedDateTime = requestedDateTime
            self.serviceRole = serviceRole
            self.standardErrorUrl = standardErrorUrl
            self.standardOutputUrl = standardOutputUrl
            self.status = status
            self.statusDetails = statusDetails
            self.traceOutput = traceOutput
        }

        private enum CodingKeys: String, CodingKey {
            case cloudWatchOutputConfig = "CloudWatchOutputConfig"
            case commandId = "CommandId"
            case commandPlugins = "CommandPlugins"
            case comment = "Comment"
            case documentName = "DocumentName"
            case documentVersion = "DocumentVersion"
            case instanceId = "InstanceId"
            case instanceName = "InstanceName"
            case notificationConfig = "NotificationConfig"
            case requestedDateTime = "RequestedDateTime"
            case serviceRole = "ServiceRole"
            case standardErrorUrl = "StandardErrorUrl"
            case standardOutputUrl = "StandardOutputUrl"
            case status = "Status"
            case statusDetails = "StatusDetails"
            case traceOutput = "TraceOutput"
        }
    }

    public struct CommandPlugin: AWSDecodableShape {
        /// The name of the plugin. Must be one of the following: aws:updateAgent, aws:domainjoin, aws:applications, aws:runPowerShellScript, aws:psmodule, aws:cloudWatch, aws:runShellScript, or aws:updateSSMAgent.
        public let name: String?
        /// Output of the plugin execution.
        public let output: String?
        /// The S3 bucket where the responses to the command executions should be stored. This was requested when issuing the command. For example, in the following response:  amzn-s3-demo-bucket/my-prefix/i-02573cafcfEXAMPLE/awsrunShellScript   amzn-s3-demo-bucket is the name of the S3 bucket;  my-prefix is the name of the S3 prefix;  i-02573cafcfEXAMPLE is the managed node ID;  awsrunShellScript is the name of the plugin.
        public let outputS3BucketName: String?
        /// The S3 directory path inside the bucket where the responses to the command executions should be stored. This was requested when issuing the command. For example, in the following response:  amzn-s3-demo-bucket/my-prefix/i-02573cafcfEXAMPLE/awsrunShellScript   amzn-s3-demo-bucket is the name of the S3 bucket;  my-prefix is the name of the S3 prefix;  i-02573cafcfEXAMPLE is the managed node ID;  awsrunShellScript is the name of the plugin.
        public let outputS3KeyPrefix: String?
        /// (Deprecated) You can no longer specify this parameter. The system ignores it. Instead, Amazon Web Services Systems Manager automatically determines the S3 bucket region.
        public let outputS3Region: String?
        /// A numeric response code generated after running the plugin.
        public let responseCode: Int?
        /// The time the plugin stopped running. Could stop prematurely if, for example, a cancel command was sent.
        public let responseFinishDateTime: Date?
        /// The time the plugin started running.
        public let responseStartDateTime: Date?
        /// The URL for the complete text written by the plugin to stderr. If execution isn't yet complete, then this string is empty.
        public let standardErrorUrl: String?
        /// The URL for the complete text written by the plugin to stdout in Amazon S3. If the S3 bucket for the command wasn't specified, then this string is empty.
        public let standardOutputUrl: String?
        /// The status of this plugin. You can run a document with multiple plugins.
        public let status: CommandPluginStatus?
        /// A detailed status of the plugin execution. StatusDetails includes more information than Status because it includes states resulting from error and concurrency control parameters. StatusDetails can show different results than Status. For more information about these statuses, see Understanding command statuses in the Amazon Web Services Systems Manager User Guide. StatusDetails can be one of the following values:   Pending: The command hasn't been sent to the managed node.   In Progress: The command has been sent to the managed node but hasn't reached a terminal state.   Success: The execution of the command or plugin was successfully completed. This is a terminal state.   Delivery Timed Out: The command wasn't delivered to the managed node before the delivery timeout expired. Delivery timeouts don't count against the parent command's MaxErrors limit, but they do contribute to whether the parent command status is Success or Incomplete. This is a terminal state.   Execution Timed Out: Command execution started on the managed node, but the execution wasn't complete before the execution timeout expired. Execution timeouts count against the MaxErrors limit of the parent command. This is a terminal state.   Failed: The command wasn't successful on the managed node. For a plugin, this indicates that the result code wasn't zero. For a command invocation, this indicates that the result code for one or more plugins wasn't zero. Invocation failures count against the MaxErrors limit of the parent command. This is a terminal state.   Cancelled: The command was terminated before it was completed. This is a terminal state.   Undeliverable: The command can't be delivered to the managed node. The managed node might not exist, or it might not be responding. Undeliverable invocations don't count against the parent command's MaxErrors limit, and they don't contribute to whether the parent command status is Success or Incomplete. This is a terminal state.   Terminated: The parent command exceeded its MaxErrors limit and subsequent command invocations were canceled by the system. This is a terminal state.
        public let statusDetails: String?

        @inlinable
        public init(name: String? = nil, output: String? = nil, outputS3BucketName: String? = nil, outputS3KeyPrefix: String? = nil, outputS3Region: String? = nil, responseCode: Int? = nil, responseFinishDateTime: Date? = nil, responseStartDateTime: Date? = nil, standardErrorUrl: String? = nil, standardOutputUrl: String? = nil, status: CommandPluginStatus? = nil, statusDetails: String? = nil) {
            self.name = name
            self.output = output
            self.outputS3BucketName = outputS3BucketName
            self.outputS3KeyPrefix = outputS3KeyPrefix
            self.outputS3Region = outputS3Region
            self.responseCode = responseCode
            self.responseFinishDateTime = responseFinishDateTime
            self.responseStartDateTime = responseStartDateTime
            self.standardErrorUrl = standardErrorUrl
            self.standardOutputUrl = standardOutputUrl
            self.status = status
            self.statusDetails = statusDetails
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case output = "Output"
            case outputS3BucketName = "OutputS3BucketName"
            case outputS3KeyPrefix = "OutputS3KeyPrefix"
            case outputS3Region = "OutputS3Region"
            case responseCode = "ResponseCode"
            case responseFinishDateTime = "ResponseFinishDateTime"
            case responseStartDateTime = "ResponseStartDateTime"
            case standardErrorUrl = "StandardErrorUrl"
            case standardOutputUrl = "StandardOutputUrl"
            case status = "Status"
            case statusDetails = "StatusDetails"
        }
    }

    public struct ComplianceExecutionSummary: AWSEncodableShape & AWSDecodableShape {
        /// An ID created by the system when PutComplianceItems was called. For example, CommandID is a valid execution ID. You can use this ID in subsequent calls.
        public let executionId: String?
        /// The time the execution ran as a datetime object that is saved in the following format: yyyy-MM-dd'T'HH:mm:ss'Z'   For State Manager associations, this timestamp represents when the compliance status was captured and reported by the Systems Manager service, not when the underlying association was actually executed on the managed node. To track actual association execution times, use the DescribeAssociationExecutionTargets command or check the association execution history in the Systems Manager console.
        public let executionTime: Date
        /// The type of execution. For example, Command is a valid execution type.
        public let executionType: String?

        @inlinable
        public init(executionId: String? = nil, executionTime: Date, executionType: String? = nil) {
            self.executionId = executionId
            self.executionTime = executionTime
            self.executionType = executionType
        }

        public func validate(name: String) throws {
            try self.validate(self.executionId, name: "executionId", parent: name, max: 100)
            try self.validate(self.executionType, name: "executionType", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case executionId = "ExecutionId"
            case executionTime = "ExecutionTime"
            case executionType = "ExecutionType"
        }
    }

    public struct ComplianceItem: AWSDecodableShape {
        /// The compliance type. For example, Association (for a State Manager association), Patch, or Custom:string are all valid compliance types.
        public let complianceType: String?
        /// A "Key": "Value" tag combination for the compliance item.
        public let details: [String: String]?
        /// A summary for the compliance item. The summary includes an execution ID, the execution type (for example, command), and the execution time.  For State Manager associations, the ExecutionTime value represents when the compliance status was captured and aggregated by the Systems Manager service, not necessarily when the underlying association was executed on the managed node. State Manager updates compliance status for all associations on an instance whenever any association executes, which means multiple associations may show the same execution time even if they were executed at different times.
        public let executionSummary: ComplianceExecutionSummary?
        /// An ID for the compliance item. For example, if the compliance item is a Windows patch, the ID could be the number of the KB article; for example: KB4010320.
        public let id: String?
        /// An ID for the resource. For a managed node, this is the node ID.
        public let resourceId: String?
        /// The type of resource. ManagedInstance is currently the only supported resource type.
        public let resourceType: String?
        /// The severity of the compliance status. Severity can be one of the following: Critical, High, Medium, Low, Informational, Unspecified.
        public let severity: ComplianceSeverity?
        /// The status of the compliance item. An item is either COMPLIANT, NON_COMPLIANT, or an empty string (for Windows patches that aren't applicable).
        public let status: ComplianceStatus?
        /// A title for the compliance item. For example, if the compliance item is a Windows patch, the title could be the title of the KB article for the patch; for example: Security Update for Active Directory Federation Services.
        public let title: String?

        @inlinable
        public init(complianceType: String? = nil, details: [String: String]? = nil, executionSummary: ComplianceExecutionSummary? = nil, id: String? = nil, resourceId: String? = nil, resourceType: String? = nil, severity: ComplianceSeverity? = nil, status: ComplianceStatus? = nil, title: String? = nil) {
            self.complianceType = complianceType
            self.details = details
            self.executionSummary = executionSummary
            self.id = id
            self.resourceId = resourceId
            self.resourceType = resourceType
            self.severity = severity
            self.status = status
            self.title = title
        }

        private enum CodingKeys: String, CodingKey {
            case complianceType = "ComplianceType"
            case details = "Details"
            case executionSummary = "ExecutionSummary"
            case id = "Id"
            case resourceId = "ResourceId"
            case resourceType = "ResourceType"
            case severity = "Severity"
            case status = "Status"
            case title = "Title"
        }
    }

    public struct ComplianceItemEntry: AWSEncodableShape {
        /// A "Key": "Value" tag combination for the compliance item.
        public let details: [String: String]?
        /// The compliance item ID. For example, if the compliance item is a Windows patch, the ID could be the number of the KB article.
        public let id: String?
        /// The severity of the compliance status. Severity can be one of the following: Critical, High, Medium, Low, Informational, Unspecified.
        public let severity: ComplianceSeverity
        /// The status of the compliance item. An item is either COMPLIANT or NON_COMPLIANT.
        public let status: ComplianceStatus
        /// The title of the compliance item. For example, if the compliance item is a Windows patch, the title could be the title of the KB article for the patch; for example: Security Update for Active Directory Federation Services.
        public let title: String?

        @inlinable
        public init(details: [String: String]? = nil, id: String? = nil, severity: ComplianceSeverity, status: ComplianceStatus, title: String? = nil) {
            self.details = details
            self.id = id
            self.severity = severity
            self.status = status
            self.title = title
        }

        public func validate(name: String) throws {
            try self.details?.forEach {
                try validate($0.key, name: "details.key", parent: name, max: 64)
                try validate($0.key, name: "details.key", parent: name, min: 1)
                try validate($0.value, name: "details[\"\($0.key)\"]", parent: name, max: 4096)
            }
            try self.validate(self.title, name: "title", parent: name, max: 500)
        }

        private enum CodingKeys: String, CodingKey {
            case details = "Details"
            case id = "Id"
            case severity = "Severity"
            case status = "Status"
            case title = "Title"
        }
    }

    public struct ComplianceStringFilter: AWSEncodableShape {
        /// The name of the filter.
        public let key: String?
        /// The type of comparison that should be performed for the value: Equal, NotEqual, BeginWith, LessThan, or GreaterThan.
        public let type: ComplianceQueryOperatorType?
        /// The value for which to search.
        public let values: [String]?

        @inlinable
        public init(key: String? = nil, type: ComplianceQueryOperatorType? = nil, values: [String]? = nil) {
            self.key = key
            self.type = type
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 200)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.validate(self.values, name: "values", parent: name, max: 20)
            try self.validate(self.values, name: "values", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case type = "Type"
            case values = "Values"
        }
    }

    public struct ComplianceSummaryItem: AWSDecodableShape {
        /// The type of compliance item. For example, the compliance type can be Association, Patch, or Custom:string.
        public let complianceType: String?
        /// A list of COMPLIANT items for the specified compliance type.
        public let compliantSummary: CompliantSummary?
        /// A list of NON_COMPLIANT items for the specified compliance type.
        public let nonCompliantSummary: NonCompliantSummary?

        @inlinable
        public init(complianceType: String? = nil, compliantSummary: CompliantSummary? = nil, nonCompliantSummary: NonCompliantSummary? = nil) {
            self.complianceType = complianceType
            self.compliantSummary = compliantSummary
            self.nonCompliantSummary = nonCompliantSummary
        }

        private enum CodingKeys: String, CodingKey {
            case complianceType = "ComplianceType"
            case compliantSummary = "CompliantSummary"
            case nonCompliantSummary = "NonCompliantSummary"
        }
    }

    public struct CompliantSummary: AWSDecodableShape {
        /// The total number of resources that are compliant.
        public let compliantCount: Int?
        /// A summary of the compliance severity by compliance type.
        public let severitySummary: SeveritySummary?

        @inlinable
        public init(compliantCount: Int? = nil, severitySummary: SeveritySummary? = nil) {
            self.compliantCount = compliantCount
            self.severitySummary = severitySummary
        }

        private enum CodingKeys: String, CodingKey {
            case compliantCount = "CompliantCount"
            case severitySummary = "SeveritySummary"
        }
    }

    public struct CreateActivationRequest: AWSEncodableShape {
        /// The name of the registered, managed node as it will appear in the Amazon Web Services Systems Manager console or when you use the Amazon Web Services command line tools to list Systems Manager resources.  Don't enter personally identifiable information in this field.
        public let defaultInstanceName: String?
        /// A user-defined description of the resource that you want to register with Systems Manager.   Don't enter personally identifiable information in this field.
        public let description: String?
        /// The date by which this activation request should expire, in timestamp format, such as "2024-07-07T00:00:00". You can specify a date up to 30 days in advance. If you don't provide an expiration date, the activation code expires in 24 hours.
        public let expirationDate: Date?
        /// The name of the Identity and Access Management (IAM) role that you want to assign to the managed node. This IAM role must provide AssumeRole permissions for the Amazon Web Services Systems Manager service principal ssm.amazonaws.com. For more information, see Create the IAM service role required for Systems Manager in a hybrid and multicloud environments in the Amazon Web Services Systems Manager User Guide.  You can't specify an IAM service-linked role for this parameter. You must create a unique role.
        public let iamRole: String
        /// Specify the maximum number of managed nodes you want to register. The default value is 1.
        public let registrationLimit: Int?
        /// Reserved for internal use.
        public let registrationMetadata: [RegistrationMetadataItem]?
        /// Optional metadata that you assign to a resource. Tags enable you to categorize a resource in different ways, such as by purpose, owner, or environment. For example, you might want to tag an activation to identify which servers or virtual machines (VMs) in your on-premises environment you intend to activate. In this case, you could specify the following key-value pairs:    Key=OS,Value=Windows     Key=Environment,Value=Production     When you install SSM Agent on your on-premises servers and VMs, you specify an activation ID and code. When you specify the activation ID and code, tags assigned to the activation are automatically applied to the on-premises servers or VMs.  You can't add tags to or delete tags from an existing activation. You can tag your on-premises servers, edge devices, and VMs after they connect to Systems Manager for the first time and are assigned a managed node ID. This means they are listed in the Amazon Web Services Systems Manager console with an ID that is prefixed with "mi-". For information about how to add tags to your managed nodes, see AddTagsToResource. For information about how to remove tags from your managed nodes, see RemoveTagsFromResource.
        public let tags: [Tag]?

        @inlinable
        public init(defaultInstanceName: String? = nil, description: String? = nil, expirationDate: Date? = nil, iamRole: String, registrationLimit: Int? = nil, registrationMetadata: [RegistrationMetadataItem]? = nil, tags: [Tag]? = nil) {
            self.defaultInstanceName = defaultInstanceName
            self.description = description
            self.expirationDate = expirationDate
            self.iamRole = iamRole
            self.registrationLimit = registrationLimit
            self.registrationMetadata = registrationMetadata
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.defaultInstanceName, name: "defaultInstanceName", parent: name, max: 256)
            try self.validate(self.defaultInstanceName, name: "defaultInstanceName", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            try self.validate(self.description, name: "description", parent: name, max: 256)
            try self.validate(self.iamRole, name: "iamRole", parent: name, max: 64)
            try self.validate(self.registrationLimit, name: "registrationLimit", parent: name, max: 1000)
            try self.validate(self.registrationLimit, name: "registrationLimit", parent: name, min: 1)
            try self.registrationMetadata?.forEach {
                try $0.validate(name: "\(name).registrationMetadata[]")
            }
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 1000)
        }

        private enum CodingKeys: String, CodingKey {
            case defaultInstanceName = "DefaultInstanceName"
            case description = "Description"
            case expirationDate = "ExpirationDate"
            case iamRole = "IamRole"
            case registrationLimit = "RegistrationLimit"
            case registrationMetadata = "RegistrationMetadata"
            case tags = "Tags"
        }
    }

    public struct CreateActivationResult: AWSDecodableShape {
        /// The code the system generates when it processes the activation. The activation code functions like a password to validate the activation ID.
        public let activationCode: String?
        /// The ID number generated by the system when it processed the activation. The activation ID functions like a user name.
        public let activationId: String?

        @inlinable
        public init(activationCode: String? = nil, activationId: String? = nil) {
            self.activationCode = activationCode
            self.activationId = activationId
        }

        private enum CodingKeys: String, CodingKey {
            case activationCode = "ActivationCode"
            case activationId = "ActivationId"
        }
    }

    public struct CreateAssociationBatchRequest: AWSEncodableShape {
        /// One or more associations.
        public let entries: [CreateAssociationBatchRequestEntry]

        @inlinable
        public init(entries: [CreateAssociationBatchRequestEntry]) {
            self.entries = entries
        }

        public func validate(name: String) throws {
            try self.entries.forEach {
                try $0.validate(name: "\(name).entries[]")
            }
            try self.validate(self.entries, name: "entries", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case entries = "Entries"
        }
    }

    public struct CreateAssociationBatchRequestEntry: AWSEncodableShape & AWSDecodableShape {
        public let alarmConfiguration: AlarmConfiguration?
        /// By default, when you create a new association, the system runs it immediately after it is created and then according to the schedule you specified and when target changes are detected. Specify true for ApplyOnlyAtCronInterval if you want the association to run only according to the schedule you specified. For more information, see Understanding when associations are applied to resources and >About target updates with Automation runbooks in the Amazon Web Services Systems Manager User Guide. This parameter isn't supported for rate expressions.
        public let applyOnlyAtCronInterval: Bool?
        /// Specify a descriptive name for the association.
        public let associationName: String?
        /// Specify the target for the association. This target is required for associations that use an Automation runbook and target resources by using rate controls. Automation is a tool in Amazon Web Services Systems Manager.
        public let automationTargetParameterName: String?
        /// The names or Amazon Resource Names (ARNs) of the Change Calendar type documents your associations are gated under. The associations only run when that Change Calendar is open. For more information, see Amazon Web Services Systems Manager Change Calendar in the Amazon Web Services Systems Manager User Guide.
        public let calendarNames: [String]?
        /// The severity level to assign to the association.
        public let complianceSeverity: AssociationComplianceSeverity?
        /// The document version.
        public let documentVersion: String?
        /// The number of hours the association can run before it is canceled. Duration applies to associations that are currently running, and any pending and in progress commands on all targets. If a target was taken offline for the association to run, it is made available again immediately, without a reboot.  The Duration parameter applies only when both these conditions are true:   The association for which you specify a duration is cancelable according to the parameters of the SSM command document or Automation runbook associated with this execution.    The command specifies the  ApplyOnlyAtCronInterval parameter, which means that the association doesn't run immediately after it is created, but only according to the specified schedule.
        public let duration: Int?
        /// The managed node ID.   InstanceId has been deprecated. To specify a managed node ID for an association, use the Targets parameter. Requests that include the parameter InstanceID with Systems Manager documents (SSM documents) that use schema version 2.0 or later will fail. In addition, if you use the parameter InstanceId, you can't use the parameters AssociationName, DocumentVersion, MaxErrors, MaxConcurrency, OutputLocation, or ScheduleExpression. To use these parameters, you must use the Targets parameter.
        public let instanceId: String?
        /// The maximum number of targets allowed to run the association at the same time. You can specify a number, for example 10, or a percentage of the target set, for example 10%. The default value is 100%, which means all targets run the association at the same time. If a new managed node starts and attempts to run an association while Systems Manager is running MaxConcurrency associations, the association is allowed to run. During the next association interval, the new managed node will process its association within the limit specified for MaxConcurrency.
        public let maxConcurrency: String?
        /// The number of errors that are allowed before the system stops sending requests to run the association on additional targets. You can specify either an absolute number of errors, for example 10, or a percentage of the target set, for example 10%. If you specify 3, for example, the system stops sending requests when the fourth error is received. If you specify 0, then the system stops sending requests after the first error is returned. If you run an association on 50 managed nodes and set MaxError to 10%, then the system stops sending the request when the sixth error is received. Executions that are already running an association when MaxErrors is reached are allowed to complete, but some of these executions may fail as well. If you need to ensure that there won't be more than max-errors failed executions, set MaxConcurrency to 1 so that executions proceed one at a time.
        public let maxErrors: String?
        /// The name of the SSM document that contains the configuration information for the managed node. You can specify Command or Automation runbooks. You can specify Amazon Web Services-predefined documents, documents you created, or a document that is shared with you from another account. For SSM documents that are shared with you from other Amazon Web Services accounts, you must specify the complete SSM document ARN, in the following format:  arn:aws:ssm:region:account-id:document/document-name   For example:  arn:aws:ssm:us-east-2:12345678912:document/My-Shared-Document  For Amazon Web Services-predefined documents and SSM documents you created in your account, you only need to specify the document name. For example, AWS-ApplyPatchBaseline or My-Document.
        public let name: String
        /// An S3 bucket where you want to store the results of this request.
        public let outputLocation: InstanceAssociationOutputLocation?
        /// A description of the parameters for a document.
        public let parameters: [String: [String]]?
        /// A cron expression that specifies a schedule when the association runs.
        public let scheduleExpression: String?
        /// Number of days to wait after the scheduled day to run an association.
        public let scheduleOffset: Int?
        /// The mode for generating association compliance. You can specify AUTO or MANUAL. In AUTO mode, the system uses the status of the association execution to determine the compliance status. If the association execution runs successfully, then the association is COMPLIANT. If the association execution doesn't run successfully, the association is NON-COMPLIANT.  In MANUAL mode, you must specify the AssociationId as a parameter for the PutComplianceItems API operation. In this case, compliance data isn't managed by State Manager, a tool in Amazon Web Services Systems Manager. It is managed by your direct call to the PutComplianceItems API operation. By default, all associations use AUTO mode.
        public let syncCompliance: AssociationSyncCompliance?
        /// Use this action to create an association in multiple Regions and multiple accounts.
        public let targetLocations: [TargetLocation]?
        /// A key-value mapping of document parameters to target resources. Both Targets and TargetMaps can't be specified together.
        public let targetMaps: [[String: [String]]]?
        /// The managed nodes targeted by the request.
        public let targets: [Target]?

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, applyOnlyAtCronInterval: Bool? = nil, associationName: String? = nil, automationTargetParameterName: String? = nil, calendarNames: [String]? = nil, complianceSeverity: AssociationComplianceSeverity? = nil, documentVersion: String? = nil, duration: Int? = nil, instanceId: String? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, name: String, outputLocation: InstanceAssociationOutputLocation? = nil, parameters: [String: [String]]? = nil, scheduleExpression: String? = nil, scheduleOffset: Int? = nil, syncCompliance: AssociationSyncCompliance? = nil, targetLocations: [TargetLocation]? = nil, targetMaps: [[String: [String]]]? = nil, targets: [Target]? = nil) {
            self.alarmConfiguration = alarmConfiguration
            self.applyOnlyAtCronInterval = applyOnlyAtCronInterval
            self.associationName = associationName
            self.automationTargetParameterName = automationTargetParameterName
            self.calendarNames = calendarNames
            self.complianceSeverity = complianceSeverity
            self.documentVersion = documentVersion
            self.duration = duration
            self.instanceId = instanceId
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.name = name
            self.outputLocation = outputLocation
            self.parameters = parameters
            self.scheduleExpression = scheduleExpression
            self.scheduleOffset = scheduleOffset
            self.syncCompliance = syncCompliance
            self.targetLocations = targetLocations
            self.targetMaps = targetMaps
            self.targets = targets
        }

        public func validate(name: String) throws {
            try self.alarmConfiguration?.validate(name: "\(name).alarmConfiguration")
            try self.validate(self.associationName, name: "associationName", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.validate(self.automationTargetParameterName, name: "automationTargetParameterName", parent: name, max: 50)
            try self.validate(self.automationTargetParameterName, name: "automationTargetParameterName", parent: name, min: 1)
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.validate(self.duration, name: "duration", parent: name, max: 24)
            try self.validate(self.duration, name: "duration", parent: name, min: 1)
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, max: 7)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, min: 1)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, pattern: "^([1-9][0-9]*|[1-9][0-9]%|[1-9]%|100%)$")
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, max: 7)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, min: 1)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, pattern: "^([1-9][0-9]*|[0]|[1-9][0-9]%|[0-9]%|100%)$")
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.:/]{3,128}$")
            try self.outputLocation?.validate(name: "\(name).outputLocation")
            try self.validate(self.scheduleExpression, name: "scheduleExpression", parent: name, max: 256)
            try self.validate(self.scheduleExpression, name: "scheduleExpression", parent: name, min: 1)
            try self.validate(self.scheduleOffset, name: "scheduleOffset", parent: name, max: 6)
            try self.validate(self.scheduleOffset, name: "scheduleOffset", parent: name, min: 1)
            try self.targetLocations?.forEach {
                try $0.validate(name: "\(name).targetLocations[]")
            }
            try self.validate(self.targetLocations, name: "targetLocations", parent: name, max: 100)
            try self.validate(self.targetLocations, name: "targetLocations", parent: name, min: 1)
            try self.targetMaps?.forEach {
                try validate($0, name: "targetMaps[]", parent: name, max: 20)
                try validate($0, name: "targetMaps[]", parent: name, min: 1)
            }
            try self.validate(self.targetMaps, name: "targetMaps", parent: name, max: 300)
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
            try self.validate(self.targets, name: "targets", parent: name, max: 5)
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case applyOnlyAtCronInterval = "ApplyOnlyAtCronInterval"
            case associationName = "AssociationName"
            case automationTargetParameterName = "AutomationTargetParameterName"
            case calendarNames = "CalendarNames"
            case complianceSeverity = "ComplianceSeverity"
            case documentVersion = "DocumentVersion"
            case duration = "Duration"
            case instanceId = "InstanceId"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case name = "Name"
            case outputLocation = "OutputLocation"
            case parameters = "Parameters"
            case scheduleExpression = "ScheduleExpression"
            case scheduleOffset = "ScheduleOffset"
            case syncCompliance = "SyncCompliance"
            case targetLocations = "TargetLocations"
            case targetMaps = "TargetMaps"
            case targets = "Targets"
        }
    }

    public struct CreateAssociationBatchResult: AWSDecodableShape {
        /// Information about the associations that failed.
        public let failed: [FailedCreateAssociation]?
        /// Information about the associations that succeeded.
        public let successful: [AssociationDescription]?

        @inlinable
        public init(failed: [FailedCreateAssociation]? = nil, successful: [AssociationDescription]? = nil) {
            self.failed = failed
            self.successful = successful
        }

        private enum CodingKeys: String, CodingKey {
            case failed = "Failed"
            case successful = "Successful"
        }
    }

    public struct CreateAssociationRequest: AWSEncodableShape {
        public let alarmConfiguration: AlarmConfiguration?
        /// By default, when you create a new association, the system runs it immediately after it is created and then according to the schedule you specified and when target changes are detected. Specify true for ApplyOnlyAtCronIntervalif you want the association to run only according to the schedule you specified. For more information, see Understanding when associations are applied to resources and >About target updates with Automation runbooks in the Amazon Web Services Systems Manager User Guide. This parameter isn't supported for rate expressions.
        public let applyOnlyAtCronInterval: Bool?
        /// Specify a descriptive name for the association.
        public let associationName: String?
        /// Choose the parameter that will define how your automation will branch out. This target is required for associations that use an Automation runbook and target resources by using rate controls. Automation is a tool in Amazon Web Services Systems Manager.
        public let automationTargetParameterName: String?
        /// The names of Amazon Resource Names (ARNs) of the Change Calendar type documents you want to gate your associations under. The associations only run when that change calendar is open. For more information, see Amazon Web Services Systems Manager Change Calendar in the Amazon Web Services Systems Manager User Guide.
        public let calendarNames: [String]?
        /// The severity level to assign to the association.
        public let complianceSeverity: AssociationComplianceSeverity?
        /// The document version you want to associate with the targets. Can be a specific version or the default version.  State Manager doesn't support running associations that use a new version of a document if that document is shared from another account. State Manager always runs the default version of a document if shared from another account, even though the Systems Manager console shows that a new version was processed. If you want to run an association using a new version of a document shared form another account, you must set the document version to default.
        public let documentVersion: String?
        /// The number of hours the association can run before it is canceled. Duration applies to associations that are currently running, and any pending and in progress commands on all targets. If a target was taken offline for the association to run, it is made available again immediately, without a reboot.  The Duration parameter applies only when both these conditions are true:   The association for which you specify a duration is cancelable according to the parameters of the SSM command document or Automation runbook associated with this execution.    The command specifies the  ApplyOnlyAtCronInterval parameter, which means that the association doesn't run immediately after it is created, but only according to the specified schedule.
        public let duration: Int?
        /// The managed node ID.   InstanceId has been deprecated. To specify a managed node ID for an association, use the Targets parameter. Requests that include the parameter InstanceID with Systems Manager documents (SSM documents) that use schema version 2.0 or later will fail. In addition, if you use the parameter InstanceId, you can't use the parameters AssociationName, DocumentVersion, MaxErrors, MaxConcurrency, OutputLocation, or ScheduleExpression. To use these parameters, you must use the Targets parameter.
        public let instanceId: String?
        /// The maximum number of targets allowed to run the association at the same time. You can specify a number, for example 10, or a percentage of the target set, for example 10%. The default value is 100%, which means all targets run the association at the same time. If a new managed node starts and attempts to run an association while Systems Manager is running MaxConcurrency associations, the association is allowed to run. During the next association interval, the new managed node will process its association within the limit specified for MaxConcurrency.
        public let maxConcurrency: String?
        /// The number of errors that are allowed before the system stops sending requests to run the association on additional targets. You can specify either an absolute number of errors, for example 10, or a percentage of the target set, for example 10%. If you specify 3, for example, the system stops sending requests when the fourth error is received. If you specify 0, then the system stops sending requests after the first error is returned. If you run an association on 50 managed nodes and set MaxError to 10%, then the system stops sending the request when the sixth error is received. Executions that are already running an association when MaxErrors is reached are allowed to complete, but some of these executions may fail as well. If you need to ensure that there won't be more than max-errors failed executions, set MaxConcurrency to 1 so that executions proceed one at a time.
        public let maxErrors: String?
        /// The name of the SSM Command document or Automation runbook that contains the configuration information for the managed node. You can specify Amazon Web Services-predefined documents, documents you created, or a document that is shared with you from another Amazon Web Services account. For Systems Manager documents (SSM documents) that are shared with you from other Amazon Web Services accounts, you must specify the complete SSM document ARN, in the following format:  arn:partition:ssm:region:account-id:document/document-name   For example:  arn:aws:ssm:us-east-2:12345678912:document/My-Shared-Document  For Amazon Web Services-predefined documents and SSM documents you created in your account, you only need to specify the document name. For example, AWS-ApplyPatchBaseline or My-Document.
        public let name: String
        /// An Amazon Simple Storage Service (Amazon S3) bucket where you want to store the output details of the request.
        public let outputLocation: InstanceAssociationOutputLocation?
        /// The parameters for the runtime configuration of the document.
        public let parameters: [String: [String]]?
        /// A cron expression when the association will be applied to the targets.
        public let scheduleExpression: String?
        /// Number of days to wait after the scheduled day to run an association. For example, if you specified a cron schedule of cron(0 0 ? * THU#2 *), you could specify an offset of 3 to run the association each Sunday after the second Thursday of the month. For more information about cron schedules for associations, see Reference: Cron and rate expressions for Systems Manager in the Amazon Web Services Systems Manager User Guide.   To use offsets, you must specify the ApplyOnlyAtCronInterval parameter. This option tells the system not to run an association immediately after you create it.
        public let scheduleOffset: Int?
        /// The mode for generating association compliance. You can specify AUTO or MANUAL. In AUTO mode, the system uses the status of the association execution to determine the compliance status. If the association execution runs successfully, then the association is COMPLIANT. If the association execution doesn't run successfully, the association is NON-COMPLIANT. In MANUAL mode, you must specify the AssociationId as a parameter for the PutComplianceItems API operation. In this case, compliance data isn't managed by State Manager. It is managed by your direct call to the PutComplianceItems API operation. By default, all associations use AUTO mode.
        public let syncCompliance: AssociationSyncCompliance?
        /// Adds or overwrites one or more tags for a State Manager association. Tags are metadata that you can assign to your Amazon Web Services resources. Tags enable you to categorize your resources in different ways, for example, by purpose, owner, or environment. Each tag consists of a key and an optional value, both of which you define.
        public let tags: [Tag]?
        /// A location is a combination of Amazon Web Services Regions and Amazon Web Services accounts where you want to run the association. Use this action to create an association in multiple Regions and multiple accounts.
        public let targetLocations: [TargetLocation]?
        /// A key-value mapping of document parameters to target resources. Both Targets and TargetMaps can't be specified together.
        public let targetMaps: [[String: [String]]]?
        /// The targets for the association. You can target managed nodes by using tags, Amazon Web Services resource groups, all managed nodes in an Amazon Web Services account, or individual managed node IDs. You can target all managed nodes in an Amazon Web Services account by specifying the InstanceIds key with a value of *. For more information about choosing targets for an association, see Understanding targets and rate controls in State Manager associations in the Amazon Web Services Systems Manager User Guide.
        public let targets: [Target]?

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, applyOnlyAtCronInterval: Bool? = nil, associationName: String? = nil, automationTargetParameterName: String? = nil, calendarNames: [String]? = nil, complianceSeverity: AssociationComplianceSeverity? = nil, documentVersion: String? = nil, duration: Int? = nil, instanceId: String? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, name: String, outputLocation: InstanceAssociationOutputLocation? = nil, parameters: [String: [String]]? = nil, scheduleExpression: String? = nil, scheduleOffset: Int? = nil, syncCompliance: AssociationSyncCompliance? = nil, tags: [Tag]? = nil, targetLocations: [TargetLocation]? = nil, targetMaps: [[String: [String]]]? = nil, targets: [Target]? = nil) {
            self.alarmConfiguration = alarmConfiguration
            self.applyOnlyAtCronInterval = applyOnlyAtCronInterval
            self.associationName = associationName
            self.automationTargetParameterName = automationTargetParameterName
            self.calendarNames = calendarNames
            self.complianceSeverity = complianceSeverity
            self.documentVersion = documentVersion
            self.duration = duration
            self.instanceId = instanceId
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.name = name
            self.outputLocation = outputLocation
            self.parameters = parameters
            self.scheduleExpression = scheduleExpression
            self.scheduleOffset = scheduleOffset
            self.syncCompliance = syncCompliance
            self.tags = tags
            self.targetLocations = targetLocations
            self.targetMaps = targetMaps
            self.targets = targets
        }

        public func validate(name: String) throws {
            try self.alarmConfiguration?.validate(name: "\(name).alarmConfiguration")
            try self.validate(self.associationName, name: "associationName", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.validate(self.automationTargetParameterName, name: "automationTargetParameterName", parent: name, max: 50)
            try self.validate(self.automationTargetParameterName, name: "automationTargetParameterName", parent: name, min: 1)
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.validate(self.duration, name: "duration", parent: name, max: 24)
            try self.validate(self.duration, name: "duration", parent: name, min: 1)
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, max: 7)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, min: 1)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, pattern: "^([1-9][0-9]*|[1-9][0-9]%|[1-9]%|100%)$")
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, max: 7)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, min: 1)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, pattern: "^([1-9][0-9]*|[0]|[1-9][0-9]%|[0-9]%|100%)$")
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.:/]{3,128}$")
            try self.outputLocation?.validate(name: "\(name).outputLocation")
            try self.validate(self.scheduleExpression, name: "scheduleExpression", parent: name, max: 256)
            try self.validate(self.scheduleExpression, name: "scheduleExpression", parent: name, min: 1)
            try self.validate(self.scheduleOffset, name: "scheduleOffset", parent: name, max: 6)
            try self.validate(self.scheduleOffset, name: "scheduleOffset", parent: name, min: 1)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 1000)
            try self.targetLocations?.forEach {
                try $0.validate(name: "\(name).targetLocations[]")
            }
            try self.validate(self.targetLocations, name: "targetLocations", parent: name, max: 100)
            try self.validate(self.targetLocations, name: "targetLocations", parent: name, min: 1)
            try self.targetMaps?.forEach {
                try validate($0, name: "targetMaps[]", parent: name, max: 20)
                try validate($0, name: "targetMaps[]", parent: name, min: 1)
            }
            try self.validate(self.targetMaps, name: "targetMaps", parent: name, max: 300)
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
            try self.validate(self.targets, name: "targets", parent: name, max: 5)
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case applyOnlyAtCronInterval = "ApplyOnlyAtCronInterval"
            case associationName = "AssociationName"
            case automationTargetParameterName = "AutomationTargetParameterName"
            case calendarNames = "CalendarNames"
            case complianceSeverity = "ComplianceSeverity"
            case documentVersion = "DocumentVersion"
            case duration = "Duration"
            case instanceId = "InstanceId"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case name = "Name"
            case outputLocation = "OutputLocation"
            case parameters = "Parameters"
            case scheduleExpression = "ScheduleExpression"
            case scheduleOffset = "ScheduleOffset"
            case syncCompliance = "SyncCompliance"
            case tags = "Tags"
            case targetLocations = "TargetLocations"
            case targetMaps = "TargetMaps"
            case targets = "Targets"
        }
    }

    public struct CreateAssociationResult: AWSDecodableShape {
        /// Information about the association.
        public let associationDescription: AssociationDescription?

        @inlinable
        public init(associationDescription: AssociationDescription? = nil) {
            self.associationDescription = associationDescription
        }

        private enum CodingKeys: String, CodingKey {
            case associationDescription = "AssociationDescription"
        }
    }

    public struct CreateDocumentRequest: AWSEncodableShape {
        /// A list of key-value pairs that describe attachments to a version of a document.
        public let attachments: [AttachmentsSource]?
        /// The content for the new SSM document in JSON or YAML format. The content of the document must not exceed 64KB. This quota also includes the content specified for input parameters at runtime. We recommend storing the contents for your new document in an external JSON or YAML file and referencing the file in a command. For examples, see the following topics in the Amazon Web Services Systems Manager User Guide.    Create an SSM document (console)     Create an SSM document (command line)     Create an SSM document (API)
        public let content: String
        /// An optional field where you can specify a friendly name for the SSM document. This value can differ for each version of the document. You can update this value at a later time using the UpdateDocument operation.
        public let displayName: String?
        /// Specify the document format for the request. The document format can be JSON, YAML, or TEXT. JSON is the default format.
        public let documentFormat: DocumentFormat?
        /// The type of document to create.  The DeploymentStrategy document type is an internal-use-only document type reserved for AppConfig.
        public let documentType: DocumentType?
        /// A name for the SSM document.  You can't use the following strings as document name prefixes. These are reserved by Amazon Web Services for use as document name prefixes:    aws     amazon     amzn     AWSEC2     AWSConfigRemediation     AWSSupport
        public let name: String
        /// A list of SSM documents required by a document. This parameter is used exclusively by AppConfig. When a user creates an AppConfig configuration in an SSM document, the user must also specify a required document for validation purposes. In this case, an ApplicationConfiguration document requires an ApplicationConfigurationSchema document for validation purposes. For more information, see What is AppConfig? in the AppConfig User Guide.
        public let requires: [DocumentRequires]?
        /// Optional metadata that you assign to a resource. Tags enable you to categorize a resource in different ways, such as by purpose, owner, or environment. For example, you might want to tag an SSM document to identify the types of targets or the environment where it will run. In this case, you could specify the following key-value pairs:    Key=OS,Value=Windows     Key=Environment,Value=Production     To add tags to an existing SSM document, use the AddTagsToResource operation.
        public let tags: [Tag]?
        /// Specify a target type to define the kinds of resources the document can run on. For example, to run a document on EC2 instances, specify the following value: /AWS::EC2::Instance. If you specify a value of '/' the document can run on all types of resources. If you don't specify a value, the document can't run on any resources. For a list of valid resource types, see Amazon Web Services resource and property types reference in the CloudFormation User Guide.
        public let targetType: String?
        /// An optional field specifying the version of the artifact you are creating with the document. For example, Release12.1. This value is unique across all versions of a document, and can't be changed.
        public let versionName: String?

        @inlinable
        public init(attachments: [AttachmentsSource]? = nil, content: String, displayName: String? = nil, documentFormat: DocumentFormat? = nil, documentType: DocumentType? = nil, name: String, requires: [DocumentRequires]? = nil, tags: [Tag]? = nil, targetType: String? = nil, versionName: String? = nil) {
            self.attachments = attachments
            self.content = content
            self.displayName = displayName
            self.documentFormat = documentFormat
            self.documentType = documentType
            self.name = name
            self.requires = requires
            self.tags = tags
            self.targetType = targetType
            self.versionName = versionName
        }

        public func validate(name: String) throws {
            try self.attachments?.forEach {
                try $0.validate(name: "\(name).attachments[]")
            }
            try self.validate(self.attachments, name: "attachments", parent: name, max: 20)
            try self.validate(self.content, name: "content", parent: name, min: 1)
            try self.validate(self.displayName, name: "displayName", parent: name, max: 1024)
            try self.validate(self.displayName, name: "displayName", parent: name, pattern: "^[\\w\\.\\-\\:\\/ ]*$")
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.requires?.forEach {
                try $0.validate(name: "\(name).requires[]")
            }
            try self.validate(self.requires, name: "requires", parent: name, min: 1)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 1000)
            try self.validate(self.targetType, name: "targetType", parent: name, max: 200)
            try self.validate(self.targetType, name: "targetType", parent: name, pattern: "^\\/[\\w\\.\\-\\:\\/]*$")
            try self.validate(self.versionName, name: "versionName", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{1,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case attachments = "Attachments"
            case content = "Content"
            case displayName = "DisplayName"
            case documentFormat = "DocumentFormat"
            case documentType = "DocumentType"
            case name = "Name"
            case requires = "Requires"
            case tags = "Tags"
            case targetType = "TargetType"
            case versionName = "VersionName"
        }
    }

    public struct CreateDocumentResult: AWSDecodableShape {
        /// Information about the SSM document.
        public let documentDescription: DocumentDescription?

        @inlinable
        public init(documentDescription: DocumentDescription? = nil) {
            self.documentDescription = documentDescription
        }

        private enum CodingKeys: String, CodingKey {
            case documentDescription = "DocumentDescription"
        }
    }

    public struct CreateMaintenanceWindowRequest: AWSEncodableShape {
        /// Enables a maintenance window task to run on managed nodes, even if you haven't registered those nodes as targets. If enabled, then you must specify the unregistered managed nodes (by node ID) when you register a task with the maintenance window. If you don't enable this option, then you must specify previously-registered targets when you register a task with the maintenance window.
        public let allowUnassociatedTargets: Bool
        /// User-provided idempotency token.
        public let clientToken: String?
        /// The number of hours before the end of the maintenance window that Amazon Web Services Systems Manager stops scheduling new tasks for execution.
        public let cutoff: Int
        /// An optional description for the maintenance window. We recommend specifying a description to help you organize your maintenance windows.
        public let description: String?
        /// The duration of the maintenance window in hours.
        public let duration: Int
        /// The date and time, in ISO-8601 Extended format, for when you want the maintenance window to become inactive. EndDate allows you to set a date and time in the future when the maintenance window will no longer run.
        public let endDate: String?
        /// The name of the maintenance window.
        public let name: String
        /// The schedule of the maintenance window in the form of a cron or rate expression.
        public let schedule: String
        /// The number of days to wait after the date and time specified by a cron expression before running the maintenance window. For example, the following cron expression schedules a maintenance window to run on the third Tuesday of every month at 11:30 PM.  cron(30 23 ? * TUE#3 *)  If the schedule offset is 2, the maintenance window won't run until two days later.
        public let scheduleOffset: Int?
        /// The time zone that the scheduled maintenance window executions are based on, in Internet Assigned Numbers Authority (IANA) format. For example: "America/Los_Angeles", "UTC", or "Asia/Seoul". For more information, see the Time Zone Database on the IANA website.
        public let scheduleTimezone: String?
        /// The date and time, in ISO-8601 Extended format, for when you want the maintenance window to become active. StartDate allows you to delay activation of the maintenance window until the specified future date.  When using a rate schedule, if you provide a start date that occurs in the past, the current date and time are used as the start date.
        public let startDate: String?
        /// Optional metadata that you assign to a resource. Tags enable you to categorize a resource in different ways, such as by purpose, owner, or environment. For example, you might want to tag a maintenance window to identify the type of tasks it will run, the types of targets, and the environment it will run in. In this case, you could specify the following key-value pairs:    Key=TaskType,Value=AgentUpdate     Key=OS,Value=Windows     Key=Environment,Value=Production     To add tags to an existing maintenance window, use the AddTagsToResource operation.
        public let tags: [Tag]?

        @inlinable
        public init(allowUnassociatedTargets: Bool = false, clientToken: String? = CreateMaintenanceWindowRequest.idempotencyToken(), cutoff: Int = 0, description: String? = nil, duration: Int, endDate: String? = nil, name: String, schedule: String, scheduleOffset: Int? = nil, scheduleTimezone: String? = nil, startDate: String? = nil, tags: [Tag]? = nil) {
            self.allowUnassociatedTargets = allowUnassociatedTargets
            self.clientToken = clientToken
            self.cutoff = cutoff
            self.description = description
            self.duration = duration
            self.endDate = endDate
            self.name = name
            self.schedule = schedule
            self.scheduleOffset = scheduleOffset
            self.scheduleTimezone = scheduleTimezone
            self.startDate = startDate
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 64)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.cutoff, name: "cutoff", parent: name, max: 23)
            try self.validate(self.cutoff, name: "cutoff", parent: name, min: 0)
            try self.validate(self.description, name: "description", parent: name, max: 128)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.duration, name: "duration", parent: name, max: 24)
            try self.validate(self.duration, name: "duration", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 128)
            try self.validate(self.name, name: "name", parent: name, min: 3)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.validate(self.schedule, name: "schedule", parent: name, max: 256)
            try self.validate(self.schedule, name: "schedule", parent: name, min: 1)
            try self.validate(self.scheduleOffset, name: "scheduleOffset", parent: name, max: 6)
            try self.validate(self.scheduleOffset, name: "scheduleOffset", parent: name, min: 1)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 1000)
        }

        private enum CodingKeys: String, CodingKey {
            case allowUnassociatedTargets = "AllowUnassociatedTargets"
            case clientToken = "ClientToken"
            case cutoff = "Cutoff"
            case description = "Description"
            case duration = "Duration"
            case endDate = "EndDate"
            case name = "Name"
            case schedule = "Schedule"
            case scheduleOffset = "ScheduleOffset"
            case scheduleTimezone = "ScheduleTimezone"
            case startDate = "StartDate"
            case tags = "Tags"
        }
    }

    public struct CreateMaintenanceWindowResult: AWSDecodableShape {
        /// The ID of the created maintenance window.
        public let windowId: String?

        @inlinable
        public init(windowId: String? = nil) {
            self.windowId = windowId
        }

        private enum CodingKeys: String, CodingKey {
            case windowId = "WindowId"
        }
    }

    public struct CreateOpsItemRequest: AWSEncodableShape {
        /// The target Amazon Web Services account where you want to create an OpsItem. To make this call, your account must be configured to work with OpsItems across accounts. For more information, see Set up OpsCenter in the Amazon Web Services Systems Manager User Guide.
        public let accountId: String?
        /// The time a runbook workflow ended. Currently reported only for the OpsItem type /aws/changerequest.
        public let actualEndTime: Date?
        /// The time a runbook workflow started. Currently reported only for the OpsItem type /aws/changerequest.
        public let actualStartTime: Date?
        /// Specify a category to assign to an OpsItem.
        public let category: String?
        /// User-defined text that contains information about the OpsItem, in Markdown format.   Provide enough information so that users viewing this OpsItem for the first time understand the issue.
        public let description: String
        /// The Amazon Resource Name (ARN) of an SNS topic where notifications are sent when this OpsItem is edited or changed.
        public let notifications: [OpsItemNotification]?
        /// Operational data is custom data that provides useful reference details about the OpsItem. For example, you can specify log files, error strings, license keys, troubleshooting tips, or other relevant data. You enter operational data as key-value pairs. The key has a maximum length of 128 characters. The value has a maximum size of 20 KB.  Operational data keys can't begin with the following: amazon, aws, amzn, ssm, /amazon, /aws, /amzn, /ssm.  You can choose to make the data searchable by other users in the account or you can restrict search access. Searchable data means that all users with access to the OpsItem Overview page (as provided by the DescribeOpsItems API operation) can view and search on the specified data. Operational data that isn't searchable is only viewable by users who have access to the OpsItem (as provided by the GetOpsItem API operation). Use the /aws/resources key in OperationalData to specify a related resource in the request. Use the /aws/automations key in OperationalData to associate an Automation runbook with the OpsItem. To view Amazon Web Services CLI example commands that use these keys, see Create OpsItems manually in the Amazon Web Services Systems Manager User Guide.
        public let operationalData: [String: OpsItemDataValue]?
        /// The type of OpsItem to create. Systems Manager supports the following types of OpsItems:    /aws/issue  This type of OpsItem is used for default OpsItems created by OpsCenter.     /aws/changerequest  This type of OpsItem is used by Change Manager for reviewing and approving or rejecting change requests.     /aws/insight  This type of OpsItem is used by OpsCenter for aggregating and reporting on duplicate OpsItems.
        public let opsItemType: String?
        /// The time specified in a change request for a runbook workflow to end. Currently supported only for the OpsItem type /aws/changerequest.
        public let plannedEndTime: Date?
        /// The time specified in a change request for a runbook workflow to start. Currently supported only for the OpsItem type /aws/changerequest.
        public let plannedStartTime: Date?
        /// The importance of this OpsItem in relation to other OpsItems in the system.
        public let priority: Int?
        /// One or more OpsItems that share something in common with the current OpsItems. For example, related OpsItems can include OpsItems with similar error messages, impacted resources, or statuses for the impacted resource.
        public let relatedOpsItems: [RelatedOpsItem]?
        /// Specify a severity to assign to an OpsItem.
        public let severity: String?
        /// The origin of the OpsItem, such as Amazon EC2 or Systems Manager.  The source name can't contain the following strings: aws, amazon, and amzn.
        public let source: String
        /// Optional metadata that you assign to a resource. Tags use a key-value pair. For example:  Key=Department,Value=Finance   To add tags to a new OpsItem, a user must have IAM permissions for both the ssm:CreateOpsItems operation and the ssm:AddTagsToResource operation. To add tags to an existing OpsItem, use the AddTagsToResource operation.
        public let tags: [Tag]?
        /// A short heading that describes the nature of the OpsItem and the impacted resource.
        public let title: String

        @inlinable
        public init(accountId: String? = nil, actualEndTime: Date? = nil, actualStartTime: Date? = nil, category: String? = nil, description: String, notifications: [OpsItemNotification]? = nil, operationalData: [String: OpsItemDataValue]? = nil, opsItemType: String? = nil, plannedEndTime: Date? = nil, plannedStartTime: Date? = nil, priority: Int? = nil, relatedOpsItems: [RelatedOpsItem]? = nil, severity: String? = nil, source: String, tags: [Tag]? = nil, title: String) {
            self.accountId = accountId
            self.actualEndTime = actualEndTime
            self.actualStartTime = actualStartTime
            self.category = category
            self.description = description
            self.notifications = notifications
            self.operationalData = operationalData
            self.opsItemType = opsItemType
            self.plannedEndTime = plannedEndTime
            self.plannedStartTime = plannedStartTime
            self.priority = priority
            self.relatedOpsItems = relatedOpsItems
            self.severity = severity
            self.source = source
            self.tags = tags
            self.title = title
        }

        public func validate(name: String) throws {
            try self.validate(self.accountId, name: "accountId", parent: name, pattern: "^[0-9]{12}$")
            try self.validate(self.category, name: "category", parent: name, max: 64)
            try self.validate(self.category, name: "category", parent: name, min: 1)
            try self.validate(self.category, name: "category", parent: name, pattern: "^(?!\\s*$).+$")
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[\\s\\S]*\\S[\\s\\S]*$")
            try self.operationalData?.forEach {
                try validate($0.key, name: "operationalData.key", parent: name, max: 128)
                try validate($0.key, name: "operationalData.key", parent: name, min: 1)
                try validate($0.key, name: "operationalData.key", parent: name, pattern: "^(?!\\s*$).+$")
                try $0.value.validate(name: "\(name).operationalData[\"\($0.key)\"]")
            }
            try self.validate(self.priority, name: "priority", parent: name, max: 5)
            try self.validate(self.priority, name: "priority", parent: name, min: 1)
            try self.validate(self.severity, name: "severity", parent: name, max: 64)
            try self.validate(self.severity, name: "severity", parent: name, min: 1)
            try self.validate(self.severity, name: "severity", parent: name, pattern: "^(?!\\s*$).+$")
            try self.validate(self.source, name: "source", parent: name, max: 128)
            try self.validate(self.source, name: "source", parent: name, min: 1)
            try self.validate(self.source, name: "source", parent: name, pattern: "^(?!\\s*$).+$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 1000)
            try self.validate(self.title, name: "title", parent: name, max: 1024)
            try self.validate(self.title, name: "title", parent: name, min: 1)
            try self.validate(self.title, name: "title", parent: name, pattern: "^(?!\\s*$).+$")
        }

        private enum CodingKeys: String, CodingKey {
            case accountId = "AccountId"
            case actualEndTime = "ActualEndTime"
            case actualStartTime = "ActualStartTime"
            case category = "Category"
            case description = "Description"
            case notifications = "Notifications"
            case operationalData = "OperationalData"
            case opsItemType = "OpsItemType"
            case plannedEndTime = "PlannedEndTime"
            case plannedStartTime = "PlannedStartTime"
            case priority = "Priority"
            case relatedOpsItems = "RelatedOpsItems"
            case severity = "Severity"
            case source = "Source"
            case tags = "Tags"
            case title = "Title"
        }
    }

    public struct CreateOpsItemResponse: AWSDecodableShape {
        /// The OpsItem Amazon Resource Name (ARN).
        public let opsItemArn: String?
        /// The ID of the OpsItem.
        public let opsItemId: String?

        @inlinable
        public init(opsItemArn: String? = nil, opsItemId: String? = nil) {
            self.opsItemArn = opsItemArn
            self.opsItemId = opsItemId
        }

        private enum CodingKeys: String, CodingKey {
            case opsItemArn = "OpsItemArn"
            case opsItemId = "OpsItemId"
        }
    }

    public struct CreateOpsMetadataRequest: AWSEncodableShape {
        /// Metadata for a new Application Manager application.
        public let metadata: [String: MetadataValue]?
        /// A resource ID for a new Application Manager application.
        public let resourceId: String
        /// Optional metadata that you assign to a resource. You can specify a maximum of five tags for an OpsMetadata object. Tags enable you to categorize a resource in different ways, such as by purpose, owner, or environment. For example, you might want to tag an OpsMetadata object to identify an environment or target Amazon Web Services Region. In this case, you could specify the following key-value pairs:    Key=Environment,Value=Production     Key=Region,Value=us-east-2
        public let tags: [Tag]?

        @inlinable
        public init(metadata: [String: MetadataValue]? = nil, resourceId: String, tags: [Tag]? = nil) {
            self.metadata = metadata
            self.resourceId = resourceId
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.metadata?.forEach {
                try validate($0.key, name: "metadata.key", parent: name, max: 256)
                try validate($0.key, name: "metadata.key", parent: name, min: 1)
                try validate($0.key, name: "metadata.key", parent: name, pattern: "^(?!\\s*$).+$")
                try $0.value.validate(name: "\(name).metadata[\"\($0.key)\"]")
            }
            try self.validate(self.metadata, name: "metadata", parent: name, max: 5)
            try self.validate(self.metadata, name: "metadata", parent: name, min: 1)
            try self.validate(self.resourceId, name: "resourceId", parent: name, max: 1024)
            try self.validate(self.resourceId, name: "resourceId", parent: name, min: 1)
            try self.validate(self.resourceId, name: "resourceId", parent: name, pattern: "^(?!\\s*$).+$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 1000)
        }

        private enum CodingKeys: String, CodingKey {
            case metadata = "Metadata"
            case resourceId = "ResourceId"
            case tags = "Tags"
        }
    }

    public struct CreateOpsMetadataResult: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the OpsMetadata Object or blob created by the call.
        public let opsMetadataArn: String?

        @inlinable
        public init(opsMetadataArn: String? = nil) {
            self.opsMetadataArn = opsMetadataArn
        }

        private enum CodingKeys: String, CodingKey {
            case opsMetadataArn = "OpsMetadataArn"
        }
    }

    public struct CreatePatchBaselineRequest: AWSEncodableShape {
        /// A set of rules used to include patches in the baseline.
        public let approvalRules: PatchRuleGroup?
        /// A list of explicitly approved patches for the baseline. For information about accepted formats for lists of approved patches and rejected patches, see Package name formats for approved and rejected patch lists in the Amazon Web Services Systems Manager User Guide.
        public let approvedPatches: [String]?
        /// Defines the compliance level for approved patches. When an approved patch is reported as missing, this value describes the severity of the compliance violation. The default value is UNSPECIFIED.
        public let approvedPatchesComplianceLevel: PatchComplianceLevel?
        /// Indicates whether the list of approved patches includes non-security updates that should be applied to the managed nodes. The default value is false. Applies to Linux managed nodes only.
        public let approvedPatchesEnableNonSecurity: Bool?
        /// Indicates the status you want to assign to security patches that are available but not approved because they don't meet the installation criteria specified in the patch baseline. Example scenario: Security patches that you might want installed can be skipped if you have specified a long period to wait after a patch is released before installation. If an update to the patch is released during your specified waiting period, the waiting period for installing the patch starts over. If the waiting period is too long, multiple versions of the patch could be released but never installed. Supported for Windows Server managed nodes only.
        public let availableSecurityUpdatesComplianceStatus: PatchComplianceStatus?
        /// User-provided idempotency token.
        public let clientToken: String?
        /// A description of the patch baseline.
        public let description: String?
        /// A set of global filters used to include patches in the baseline.  The GlobalFilters parameter can be configured only by using the CLI or an Amazon Web Services SDK. It can't be configured from the Patch Manager console, and its value isn't displayed in the console.
        public let globalFilters: PatchFilterGroup?
        /// The name of the patch baseline.
        public let name: String
        /// Defines the operating system the patch baseline applies to. The default value is WINDOWS.
        public let operatingSystem: OperatingSystem?
        /// A list of explicitly rejected patches for the baseline. For information about accepted formats for lists of approved patches and rejected patches, see Package name formats for approved and rejected patch lists in the Amazon Web Services Systems Manager User Guide.
        public let rejectedPatches: [String]?
        /// The action for Patch Manager to take on patches included in the RejectedPackages list.  ALLOW_AS_DEPENDENCY   Linux and macOS: A package in the rejected patches list is installed only if it is a dependency of another package. It is considered compliant with the patch baseline, and its status is reported as INSTALLED_OTHER. This is the default action if no option is specified.  Windows Server: Windows Server doesn't support the concept of package dependencies. If a package in the rejected patches list and already installed on the node, its status is reported as INSTALLED_OTHER. Any package not already installed on the node is skipped. This is the default action if no option is specified.  BLOCK   All OSs: Packages in the rejected patches list, and packages that include them as dependencies, aren't installed by Patch Manager under any circumstances. If a package was installed before it was added to the rejected patches list, or is installed outside of Patch Manager afterward, it's considered noncompliant with the patch baseline and its status is reported as INSTALLED_REJECTED.
        public let rejectedPatchesAction: PatchAction?
        /// Information about the patches to use to update the managed nodes, including target operating systems and source repositories. Applies to Linux managed nodes only.
        public let sources: [PatchSource]?
        /// Optional metadata that you assign to a resource. Tags enable you to categorize a resource in different ways, such as by purpose, owner, or environment. For example, you might want to tag a patch baseline to identify the severity level of patches it specifies and the operating system family it applies to. In this case, you could specify the following key-value pairs:    Key=PatchSeverity,Value=Critical     Key=OS,Value=Windows     To add tags to an existing patch baseline, use the AddTagsToResource operation.
        public let tags: [Tag]?

        @inlinable
        public init(approvalRules: PatchRuleGroup? = nil, approvedPatches: [String]? = nil, approvedPatchesComplianceLevel: PatchComplianceLevel? = nil, approvedPatchesEnableNonSecurity: Bool? = nil, availableSecurityUpdatesComplianceStatus: PatchComplianceStatus? = nil, clientToken: String? = CreatePatchBaselineRequest.idempotencyToken(), description: String? = nil, globalFilters: PatchFilterGroup? = nil, name: String, operatingSystem: OperatingSystem? = nil, rejectedPatches: [String]? = nil, rejectedPatchesAction: PatchAction? = nil, sources: [PatchSource]? = nil, tags: [Tag]? = nil) {
            self.approvalRules = approvalRules
            self.approvedPatches = approvedPatches
            self.approvedPatchesComplianceLevel = approvedPatchesComplianceLevel
            self.approvedPatchesEnableNonSecurity = approvedPatchesEnableNonSecurity
            self.availableSecurityUpdatesComplianceStatus = availableSecurityUpdatesComplianceStatus
            self.clientToken = clientToken
            self.description = description
            self.globalFilters = globalFilters
            self.name = name
            self.operatingSystem = operatingSystem
            self.rejectedPatches = rejectedPatches
            self.rejectedPatchesAction = rejectedPatchesAction
            self.sources = sources
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.approvalRules?.validate(name: "\(name).approvalRules")
            try self.approvedPatches?.forEach {
                try validate($0, name: "approvedPatches[]", parent: name, max: 100)
                try validate($0, name: "approvedPatches[]", parent: name, min: 1)
            }
            try self.validate(self.approvedPatches, name: "approvedPatches", parent: name, max: 50)
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 64)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, max: 1024)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.globalFilters?.validate(name: "\(name).globalFilters")
            try self.validate(self.name, name: "name", parent: name, max: 128)
            try self.validate(self.name, name: "name", parent: name, min: 3)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.rejectedPatches?.forEach {
                try validate($0, name: "rejectedPatches[]", parent: name, max: 100)
                try validate($0, name: "rejectedPatches[]", parent: name, min: 1)
            }
            try self.validate(self.rejectedPatches, name: "rejectedPatches", parent: name, max: 50)
            try self.sources?.forEach {
                try $0.validate(name: "\(name).sources[]")
            }
            try self.validate(self.sources, name: "sources", parent: name, max: 20)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 1000)
        }

        private enum CodingKeys: String, CodingKey {
            case approvalRules = "ApprovalRules"
            case approvedPatches = "ApprovedPatches"
            case approvedPatchesComplianceLevel = "ApprovedPatchesComplianceLevel"
            case approvedPatchesEnableNonSecurity = "ApprovedPatchesEnableNonSecurity"
            case availableSecurityUpdatesComplianceStatus = "AvailableSecurityUpdatesComplianceStatus"
            case clientToken = "ClientToken"
            case description = "Description"
            case globalFilters = "GlobalFilters"
            case name = "Name"
            case operatingSystem = "OperatingSystem"
            case rejectedPatches = "RejectedPatches"
            case rejectedPatchesAction = "RejectedPatchesAction"
            case sources = "Sources"
            case tags = "Tags"
        }
    }

    public struct CreatePatchBaselineResult: AWSDecodableShape {
        /// The ID of the created patch baseline.
        public let baselineId: String?

        @inlinable
        public init(baselineId: String? = nil) {
            self.baselineId = baselineId
        }

        private enum CodingKeys: String, CodingKey {
            case baselineId = "BaselineId"
        }
    }

    public struct CreateResourceDataSyncRequest: AWSEncodableShape {
        /// Amazon S3 configuration details for the sync. This parameter is required if the SyncType value is SyncToDestination.
        public let s3Destination: ResourceDataSyncS3Destination?
        /// A name for the configuration.
        public let syncName: String
        /// Specify information about the data sources to synchronize. This parameter is required if the SyncType value is SyncFromSource.
        public let syncSource: ResourceDataSyncSource?
        /// Specify SyncToDestination to create a resource data sync that synchronizes data to an S3 bucket for Inventory. If you specify SyncToDestination, you must provide a value for S3Destination. Specify SyncFromSource to synchronize data from a single account and multiple Regions, or multiple Amazon Web Services accounts and Amazon Web Services Regions, as listed in Organizations for Explorer. If you specify SyncFromSource, you must provide a value for SyncSource. The default value is SyncToDestination.
        public let syncType: String?

        @inlinable
        public init(s3Destination: ResourceDataSyncS3Destination? = nil, syncName: String, syncSource: ResourceDataSyncSource? = nil, syncType: String? = nil) {
            self.s3Destination = s3Destination
            self.syncName = syncName
            self.syncSource = syncSource
            self.syncType = syncType
        }

        public func validate(name: String) throws {
            try self.s3Destination?.validate(name: "\(name).s3Destination")
            try self.validate(self.syncName, name: "syncName", parent: name, max: 64)
            try self.validate(self.syncName, name: "syncName", parent: name, min: 1)
            try self.syncSource?.validate(name: "\(name).syncSource")
            try self.validate(self.syncType, name: "syncType", parent: name, max: 64)
            try self.validate(self.syncType, name: "syncType", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case s3Destination = "S3Destination"
            case syncName = "SyncName"
            case syncSource = "SyncSource"
            case syncType = "SyncType"
        }
    }

    public struct CreateResourceDataSyncResult: AWSDecodableShape {
        public init() {}
    }

    public struct Credentials: AWSDecodableShape {
        /// The access key ID that identifies the temporary security credentials.
        public let accessKeyId: String
        /// The datetime on which the current credentials expire.
        public let expirationTime: Date
        /// The secret access key that can be used to sign requests.
        public let secretAccessKey: String
        /// The token that users must pass to the service API to use the temporary credentials.
        public let sessionToken: String

        @inlinable
        public init(accessKeyId: String, expirationTime: Date, secretAccessKey: String, sessionToken: String) {
            self.accessKeyId = accessKeyId
            self.expirationTime = expirationTime
            self.secretAccessKey = secretAccessKey
            self.sessionToken = sessionToken
        }

        private enum CodingKeys: String, CodingKey {
            case accessKeyId = "AccessKeyId"
            case expirationTime = "ExpirationTime"
            case secretAccessKey = "SecretAccessKey"
            case sessionToken = "SessionToken"
        }
    }

    public struct DeleteActivationRequest: AWSEncodableShape {
        /// The ID of the activation that you want to delete.
        public let activationId: String

        @inlinable
        public init(activationId: String) {
            self.activationId = activationId
        }

        public func validate(name: String) throws {
            try self.validate(self.activationId, name: "activationId", parent: name, pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case activationId = "ActivationId"
        }
    }

    public struct DeleteActivationResult: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteAssociationRequest: AWSEncodableShape {
        /// The association ID that you want to delete.
        public let associationId: String?
        /// The managed node ID.   InstanceId has been deprecated. To specify a managed node ID for an association, use the Targets parameter. Requests that include the parameter InstanceID with Systems Manager documents (SSM documents) that use schema version 2.0 or later will fail. In addition, if you use the parameter InstanceId, you can't use the parameters AssociationName, DocumentVersion, MaxErrors, MaxConcurrency, OutputLocation, or ScheduleExpression. To use these parameters, you must use the Targets parameter.
        public let instanceId: String?
        /// The name of the SSM document.
        public let name: String?

        @inlinable
        public init(associationId: String? = nil, instanceId: String? = nil, name: String? = nil) {
            self.associationId = associationId
            self.instanceId = instanceId
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.associationId, name: "associationId", parent: name, pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.:/]{3,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case associationId = "AssociationId"
            case instanceId = "InstanceId"
            case name = "Name"
        }
    }

    public struct DeleteAssociationResult: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteDocumentRequest: AWSEncodableShape {
        /// The version of the document that you want to delete. If not provided, all versions of the document are deleted.
        public let documentVersion: String?
        /// Some SSM document types require that you specify a Force flag before you can delete the document. For example, you must specify a Force flag to delete a document of type ApplicationConfigurationSchema. You can restrict access to the Force flag in an Identity and Access Management (IAM) policy.
        public let force: Bool?
        /// The name of the document.
        public let name: String
        /// The version name of the document that you want to delete. If not provided, all versions of the document are deleted.
        public let versionName: String?

        @inlinable
        public init(documentVersion: String? = nil, force: Bool? = nil, name: String, versionName: String? = nil) {
            self.documentVersion = documentVersion
            self.force = force
            self.name = name
            self.versionName = versionName
        }

        public func validate(name: String) throws {
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.validate(self.versionName, name: "versionName", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{1,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case documentVersion = "DocumentVersion"
            case force = "Force"
            case name = "Name"
            case versionName = "VersionName"
        }
    }

    public struct DeleteDocumentResult: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteInventoryRequest: AWSEncodableShape {
        /// User-provided idempotency token.
        public let clientToken: String?
        /// Use this option to view a summary of the deletion request without deleting any data or the data type. This option is useful when you only want to understand what will be deleted. Once you validate that the data to be deleted is what you intend to delete, you can run the same command without specifying the DryRun option.
        public let dryRun: Bool?
        /// Use the SchemaDeleteOption to delete a custom inventory type (schema). If you don't choose this option, the system only deletes existing inventory data associated with the custom inventory type. Choose one of the following options: DisableSchema: If you choose this option, the system ignores all inventory data for the specified version, and any earlier versions. To enable this schema again, you must call the PutInventory operation for a version greater than the disabled version. DeleteSchema: This option deletes the specified custom type from the Inventory service. You can recreate the schema later, if you want.
        public let schemaDeleteOption: InventorySchemaDeleteOption?
        /// The name of the custom inventory type for which you want to delete either all previously collected data or the inventory type itself.
        public let typeName: String

        @inlinable
        public init(clientToken: String? = DeleteInventoryRequest.idempotencyToken(), dryRun: Bool? = nil, schemaDeleteOption: InventorySchemaDeleteOption? = nil, typeName: String) {
            self.clientToken = clientToken
            self.dryRun = dryRun
            self.schemaDeleteOption = schemaDeleteOption
            self.typeName = typeName
        }

        public func validate(name: String) throws {
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$")
            try self.validate(self.typeName, name: "typeName", parent: name, max: 100)
            try self.validate(self.typeName, name: "typeName", parent: name, min: 1)
            try self.validate(self.typeName, name: "typeName", parent: name, pattern: "^(AWS|Custom):.*$")
        }

        private enum CodingKeys: String, CodingKey {
            case clientToken = "ClientToken"
            case dryRun = "DryRun"
            case schemaDeleteOption = "SchemaDeleteOption"
            case typeName = "TypeName"
        }
    }

    public struct DeleteInventoryResult: AWSDecodableShape {
        /// Every DeleteInventory operation is assigned a unique ID. This option returns a unique ID. You can use this ID to query the status of a delete operation. This option is useful for ensuring that a delete operation has completed before you begin other operations.
        public let deletionId: String?
        /// A summary of the delete operation. For more information about this summary, see Deleting custom inventory in the Amazon Web Services Systems Manager User Guide.
        public let deletionSummary: InventoryDeletionSummary?
        /// The name of the inventory data type specified in the request.
        public let typeName: String?

        @inlinable
        public init(deletionId: String? = nil, deletionSummary: InventoryDeletionSummary? = nil, typeName: String? = nil) {
            self.deletionId = deletionId
            self.deletionSummary = deletionSummary
            self.typeName = typeName
        }

        private enum CodingKeys: String, CodingKey {
            case deletionId = "DeletionId"
            case deletionSummary = "DeletionSummary"
            case typeName = "TypeName"
        }
    }

    public struct DeleteMaintenanceWindowRequest: AWSEncodableShape {
        /// The ID of the maintenance window to delete.
        public let windowId: String

        @inlinable
        public init(windowId: String) {
            self.windowId = windowId
        }

        public func validate(name: String) throws {
            try self.validate(self.windowId, name: "windowId", parent: name, max: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, min: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, pattern: "^mw-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case windowId = "WindowId"
        }
    }

    public struct DeleteMaintenanceWindowResult: AWSDecodableShape {
        /// The ID of the deleted maintenance window.
        public let windowId: String?

        @inlinable
        public init(windowId: String? = nil) {
            self.windowId = windowId
        }

        private enum CodingKeys: String, CodingKey {
            case windowId = "WindowId"
        }
    }

    public struct DeleteOpsItemRequest: AWSEncodableShape {
        /// The ID of the OpsItem that you want to delete.
        public let opsItemId: String

        @inlinable
        public init(opsItemId: String) {
            self.opsItemId = opsItemId
        }

        public func validate(name: String) throws {
            try self.validate(self.opsItemId, name: "opsItemId", parent: name, pattern: "^(oi)-[0-9a-f]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case opsItemId = "OpsItemId"
        }
    }

    public struct DeleteOpsItemResponse: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteOpsMetadataRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of an OpsMetadata Object to delete.
        public let opsMetadataArn: String

        @inlinable
        public init(opsMetadataArn: String) {
            self.opsMetadataArn = opsMetadataArn
        }

        public func validate(name: String) throws {
            try self.validate(self.opsMetadataArn, name: "opsMetadataArn", parent: name, max: 1011)
            try self.validate(self.opsMetadataArn, name: "opsMetadataArn", parent: name, min: 1)
            try self.validate(self.opsMetadataArn, name: "opsMetadataArn", parent: name, pattern: "^arn:(aws[a-zA-Z-]*)?:ssm:[a-z0-9-\\.]{0,63}:[a-z0-9-\\.]{0,63}:opsmetadata\\/([a-zA-Z0-9-_\\.\\/]*)$")
        }

        private enum CodingKeys: String, CodingKey {
            case opsMetadataArn = "OpsMetadataArn"
        }
    }

    public struct DeleteOpsMetadataResult: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteParameterRequest: AWSEncodableShape {
        /// The name of the parameter to delete.  You can't enter the Amazon Resource Name (ARN) for a parameter, only the parameter name itself.
        public let name: String

        @inlinable
        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 2048)
            try self.validate(self.name, name: "name", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
        }
    }

    public struct DeleteParameterResult: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteParametersRequest: AWSEncodableShape {
        /// The names of the parameters to delete. After deleting a parameter, wait for at least 30 seconds to create a parameter with the same name.  You can't enter the Amazon Resource Name (ARN) for a parameter, only the parameter name itself.
        public let names: [String]

        @inlinable
        public init(names: [String]) {
            self.names = names
        }

        public func validate(name: String) throws {
            try self.names.forEach {
                try validate($0, name: "names[]", parent: name, max: 2048)
                try validate($0, name: "names[]", parent: name, min: 1)
            }
            try self.validate(self.names, name: "names", parent: name, max: 10)
            try self.validate(self.names, name: "names", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case names = "Names"
        }
    }

    public struct DeleteParametersResult: AWSDecodableShape {
        /// The names of the deleted parameters.
        public let deletedParameters: [String]?
        /// The names of parameters that weren't deleted because the parameters aren't valid.
        public let invalidParameters: [String]?

        @inlinable
        public init(deletedParameters: [String]? = nil, invalidParameters: [String]? = nil) {
            self.deletedParameters = deletedParameters
            self.invalidParameters = invalidParameters
        }

        private enum CodingKeys: String, CodingKey {
            case deletedParameters = "DeletedParameters"
            case invalidParameters = "InvalidParameters"
        }
    }

    public struct DeletePatchBaselineRequest: AWSEncodableShape {
        /// The ID of the patch baseline to delete.
        public let baselineId: String

        @inlinable
        public init(baselineId: String) {
            self.baselineId = baselineId
        }

        public func validate(name: String) throws {
            try self.validate(self.baselineId, name: "baselineId", parent: name, max: 128)
            try self.validate(self.baselineId, name: "baselineId", parent: name, min: 20)
            try self.validate(self.baselineId, name: "baselineId", parent: name, pattern: "^[a-zA-Z0-9_\\-:/]{20,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case baselineId = "BaselineId"
        }
    }

    public struct DeletePatchBaselineResult: AWSDecodableShape {
        /// The ID of the deleted patch baseline.
        public let baselineId: String?

        @inlinable
        public init(baselineId: String? = nil) {
            self.baselineId = baselineId
        }

        private enum CodingKeys: String, CodingKey {
            case baselineId = "BaselineId"
        }
    }

    public struct DeleteResourceDataSyncRequest: AWSEncodableShape {
        /// The name of the configuration to delete.
        public let syncName: String
        /// Specify the type of resource data sync to delete.
        public let syncType: String?

        @inlinable
        public init(syncName: String, syncType: String? = nil) {
            self.syncName = syncName
            self.syncType = syncType
        }

        public func validate(name: String) throws {
            try self.validate(self.syncName, name: "syncName", parent: name, max: 64)
            try self.validate(self.syncName, name: "syncName", parent: name, min: 1)
            try self.validate(self.syncType, name: "syncType", parent: name, max: 64)
            try self.validate(self.syncType, name: "syncType", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case syncName = "SyncName"
            case syncType = "SyncType"
        }
    }

    public struct DeleteResourceDataSyncResult: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteResourcePolicyRequest: AWSEncodableShape {
        /// ID of the current policy version. The hash helps to prevent multiple calls from attempting to overwrite a policy.
        public let policyHash: String
        /// The policy ID.
        public let policyId: String
        /// Amazon Resource Name (ARN) of the resource to which the policies are attached.
        public let resourceArn: String

        @inlinable
        public init(policyHash: String, policyId: String, resourceArn: String) {
            self.policyHash = policyHash
            self.policyId = policyId
            self.resourceArn = resourceArn
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, max: 2048)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, min: 20)
        }

        private enum CodingKeys: String, CodingKey {
            case policyHash = "PolicyHash"
            case policyId = "PolicyId"
            case resourceArn = "ResourceArn"
        }
    }

    public struct DeleteResourcePolicyResponse: AWSDecodableShape {
        public init() {}
    }

    public struct DeregisterManagedInstanceRequest: AWSEncodableShape {
        /// The ID assigned to the managed node when you registered it using the activation process.
        public let instanceId: String

        @inlinable
        public init(instanceId: String) {
            self.instanceId = instanceId
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceId, name: "instanceId", parent: name, max: 124)
            try self.validate(self.instanceId, name: "instanceId", parent: name, min: 20)
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^mi-[0-9a-f]{17}$)|(^eks_c:[0-9A-Za-z][A-Za-z0-9\\-_]{0,99}_\\w{17}$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
        }
    }

    public struct DeregisterManagedInstanceResult: AWSDecodableShape {
        public init() {}
    }

    public struct DeregisterPatchBaselineForPatchGroupRequest: AWSEncodableShape {
        /// The ID of the patch baseline to deregister the patch group from.
        public let baselineId: String
        /// The name of the patch group that should be deregistered from the patch baseline.
        public let patchGroup: String

        @inlinable
        public init(baselineId: String, patchGroup: String) {
            self.baselineId = baselineId
            self.patchGroup = patchGroup
        }

        public func validate(name: String) throws {
            try self.validate(self.baselineId, name: "baselineId", parent: name, max: 128)
            try self.validate(self.baselineId, name: "baselineId", parent: name, min: 20)
            try self.validate(self.baselineId, name: "baselineId", parent: name, pattern: "^[a-zA-Z0-9_\\-:/]{20,128}$")
            try self.validate(self.patchGroup, name: "patchGroup", parent: name, max: 256)
            try self.validate(self.patchGroup, name: "patchGroup", parent: name, min: 1)
            try self.validate(self.patchGroup, name: "patchGroup", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
        }

        private enum CodingKeys: String, CodingKey {
            case baselineId = "BaselineId"
            case patchGroup = "PatchGroup"
        }
    }

    public struct DeregisterPatchBaselineForPatchGroupResult: AWSDecodableShape {
        /// The ID of the patch baseline the patch group was deregistered from.
        public let baselineId: String?
        /// The name of the patch group deregistered from the patch baseline.
        public let patchGroup: String?

        @inlinable
        public init(baselineId: String? = nil, patchGroup: String? = nil) {
            self.baselineId = baselineId
            self.patchGroup = patchGroup
        }

        private enum CodingKeys: String, CodingKey {
            case baselineId = "BaselineId"
            case patchGroup = "PatchGroup"
        }
    }

    public struct DeregisterTargetFromMaintenanceWindowRequest: AWSEncodableShape {
        /// The system checks if the target is being referenced by a task. If the target is being referenced, the system returns an error and doesn't deregister the target from the maintenance window.
        public let safe: Bool?
        /// The ID of the maintenance window the target should be removed from.
        public let windowId: String
        /// The ID of the target definition to remove.
        public let windowTargetId: String

        @inlinable
        public init(safe: Bool? = nil, windowId: String, windowTargetId: String) {
            self.safe = safe
            self.windowId = windowId
            self.windowTargetId = windowTargetId
        }

        public func validate(name: String) throws {
            try self.validate(self.windowId, name: "windowId", parent: name, max: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, min: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, pattern: "^mw-[0-9a-f]{17}$")
            try self.validate(self.windowTargetId, name: "windowTargetId", parent: name, max: 36)
            try self.validate(self.windowTargetId, name: "windowTargetId", parent: name, min: 36)
            try self.validate(self.windowTargetId, name: "windowTargetId", parent: name, pattern: "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case safe = "Safe"
            case windowId = "WindowId"
            case windowTargetId = "WindowTargetId"
        }
    }

    public struct DeregisterTargetFromMaintenanceWindowResult: AWSDecodableShape {
        /// The ID of the maintenance window the target was removed from.
        public let windowId: String?
        /// The ID of the removed target definition.
        public let windowTargetId: String?

        @inlinable
        public init(windowId: String? = nil, windowTargetId: String? = nil) {
            self.windowId = windowId
            self.windowTargetId = windowTargetId
        }

        private enum CodingKeys: String, CodingKey {
            case windowId = "WindowId"
            case windowTargetId = "WindowTargetId"
        }
    }

    public struct DeregisterTaskFromMaintenanceWindowRequest: AWSEncodableShape {
        /// The ID of the maintenance window the task should be removed from.
        public let windowId: String
        /// The ID of the task to remove from the maintenance window.
        public let windowTaskId: String

        @inlinable
        public init(windowId: String, windowTaskId: String) {
            self.windowId = windowId
            self.windowTaskId = windowTaskId
        }

        public func validate(name: String) throws {
            try self.validate(self.windowId, name: "windowId", parent: name, max: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, min: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, pattern: "^mw-[0-9a-f]{17}$")
            try self.validate(self.windowTaskId, name: "windowTaskId", parent: name, max: 36)
            try self.validate(self.windowTaskId, name: "windowTaskId", parent: name, min: 36)
            try self.validate(self.windowTaskId, name: "windowTaskId", parent: name, pattern: "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case windowId = "WindowId"
            case windowTaskId = "WindowTaskId"
        }
    }

    public struct DeregisterTaskFromMaintenanceWindowResult: AWSDecodableShape {
        /// The ID of the maintenance window the task was removed from.
        public let windowId: String?
        /// The ID of the task removed from the maintenance window.
        public let windowTaskId: String?

        @inlinable
        public init(windowId: String? = nil, windowTaskId: String? = nil) {
            self.windowId = windowId
            self.windowTaskId = windowTaskId
        }

        private enum CodingKeys: String, CodingKey {
            case windowId = "WindowId"
            case windowTaskId = "WindowTaskId"
        }
    }

    public struct DescribeActivationsFilter: AWSEncodableShape {
        /// The name of the filter.
        public let filterKey: DescribeActivationsFilterKeys?
        /// The filter values.
        public let filterValues: [String]?

        @inlinable
        public init(filterKey: DescribeActivationsFilterKeys? = nil, filterValues: [String]? = nil) {
            self.filterKey = filterKey
            self.filterValues = filterValues
        }

        private enum CodingKeys: String, CodingKey {
            case filterKey = "FilterKey"
            case filterValues = "FilterValues"
        }
    }

    public struct DescribeActivationsRequest: AWSEncodableShape {
        /// A filter to view information about your activations.
        public let filters: [DescribeActivationsFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(filters: [DescribeActivationsFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeActivationsResult: AWSDecodableShape {
        /// A list of activations for your Amazon Web Services account.
        public let activationList: [Activation]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(activationList: [Activation]? = nil, nextToken: String? = nil) {
            self.activationList = activationList
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case activationList = "ActivationList"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeAssociationExecutionTargetsRequest: AWSEncodableShape {
        /// The association ID that includes the execution for which you want to view details.
        public let associationId: String
        /// The execution ID for which you want to view details.
        public let executionId: String
        /// Filters for the request. You can specify the following filters and values. Status (EQUAL) ResourceId (EQUAL) ResourceType (EQUAL)
        public let filters: [AssociationExecutionTargetsFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(associationId: String, executionId: String, filters: [AssociationExecutionTargetsFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.associationId = associationId
            self.executionId = executionId
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.associationId, name: "associationId", parent: name, pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")
            try self.validate(self.executionId, name: "executionId", parent: name, pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, min: 1)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case associationId = "AssociationId"
            case executionId = "ExecutionId"
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeAssociationExecutionTargetsResult: AWSDecodableShape {
        /// Information about the execution.
        public let associationExecutionTargets: [AssociationExecutionTarget]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(associationExecutionTargets: [AssociationExecutionTarget]? = nil, nextToken: String? = nil) {
            self.associationExecutionTargets = associationExecutionTargets
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case associationExecutionTargets = "AssociationExecutionTargets"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeAssociationExecutionsRequest: AWSEncodableShape {
        /// The association ID for which you want to view execution history details.
        public let associationId: String
        /// Filters for the request. You can specify the following filters and values. ExecutionId (EQUAL) Status (EQUAL) CreatedTime (EQUAL, GREATER_THAN, LESS_THAN)
        public let filters: [AssociationExecutionFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(associationId: String, filters: [AssociationExecutionFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.associationId = associationId
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.associationId, name: "associationId", parent: name, pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, min: 1)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case associationId = "AssociationId"
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeAssociationExecutionsResult: AWSDecodableShape {
        /// A list of the executions for the specified association ID.
        public let associationExecutions: [AssociationExecution]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(associationExecutions: [AssociationExecution]? = nil, nextToken: String? = nil) {
            self.associationExecutions = associationExecutions
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case associationExecutions = "AssociationExecutions"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeAssociationRequest: AWSEncodableShape {
        /// The association ID for which you want information.
        public let associationId: String?
        /// Specify the association version to retrieve. To view the latest version, either specify $LATEST for this parameter, or omit this parameter. To view a list of all associations for a managed node, use ListAssociations. To get a list of versions for a specific association, use ListAssociationVersions.
        public let associationVersion: String?
        /// The managed node ID.
        public let instanceId: String?
        /// The name of the SSM document.
        public let name: String?

        @inlinable
        public init(associationId: String? = nil, associationVersion: String? = nil, instanceId: String? = nil, name: String? = nil) {
            self.associationId = associationId
            self.associationVersion = associationVersion
            self.instanceId = instanceId
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.associationId, name: "associationId", parent: name, pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")
            try self.validate(self.associationVersion, name: "associationVersion", parent: name, pattern: "^([$]LATEST)|([1-9][0-9]*)$")
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.:/]{3,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case associationId = "AssociationId"
            case associationVersion = "AssociationVersion"
            case instanceId = "InstanceId"
            case name = "Name"
        }
    }

    public struct DescribeAssociationResult: AWSDecodableShape {
        /// Information about the association.
        public let associationDescription: AssociationDescription?

        @inlinable
        public init(associationDescription: AssociationDescription? = nil) {
            self.associationDescription = associationDescription
        }

        private enum CodingKeys: String, CodingKey {
            case associationDescription = "AssociationDescription"
        }
    }

    public struct DescribeAutomationExecutionsRequest: AWSEncodableShape {
        /// Filters used to limit the scope of executions that are requested.
        public let filters: [AutomationExecutionFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(filters: [AutomationExecutionFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 10)
            try self.validate(self.filters, name: "filters", parent: name, min: 1)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeAutomationExecutionsResult: AWSDecodableShape {
        /// The list of details about each automation execution which has occurred which matches the filter specification, if any.
        public let automationExecutionMetadataList: [AutomationExecutionMetadata]?
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?

        @inlinable
        public init(automationExecutionMetadataList: [AutomationExecutionMetadata]? = nil, nextToken: String? = nil) {
            self.automationExecutionMetadataList = automationExecutionMetadataList
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case automationExecutionMetadataList = "AutomationExecutionMetadataList"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeAutomationStepExecutionsRequest: AWSEncodableShape {
        /// The Automation execution ID for which you want step execution descriptions.
        public let automationExecutionId: String
        /// One or more filters to limit the number of step executions returned by the request.
        public let filters: [StepExecutionFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// Indicates whether to list step executions in reverse order by start time. The default value is 'false'.
        public let reverseOrder: Bool?

        @inlinable
        public init(automationExecutionId: String, filters: [StepExecutionFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, reverseOrder: Bool? = nil) {
            self.automationExecutionId = automationExecutionId
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.reverseOrder = reverseOrder
        }

        public func validate(name: String) throws {
            try self.validate(self.automationExecutionId, name: "automationExecutionId", parent: name, max: 36)
            try self.validate(self.automationExecutionId, name: "automationExecutionId", parent: name, min: 36)
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 6)
            try self.validate(self.filters, name: "filters", parent: name, min: 1)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case automationExecutionId = "AutomationExecutionId"
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case reverseOrder = "ReverseOrder"
        }
    }

    public struct DescribeAutomationStepExecutionsResult: AWSDecodableShape {
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?
        /// A list of details about the current state of all steps that make up an execution.
        public let stepExecutions: [StepExecution]?

        @inlinable
        public init(nextToken: String? = nil, stepExecutions: [StepExecution]? = nil) {
            self.nextToken = nextToken
            self.stepExecutions = stepExecutions
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case stepExecutions = "StepExecutions"
        }
    }

    public struct DescribeAvailablePatchesRequest: AWSEncodableShape {
        /// Each element in the array is a structure containing a key-value pair.  Windows Server  Supported keys for Windows Server managed node patches include the following:     PATCH_SET   Sample values: OS | APPLICATION      PRODUCT   Sample values: WindowsServer2012 | Office 2010 | MicrosoftDefenderAntivirus      PRODUCT_FAMILY   Sample values: Windows | Office      MSRC_SEVERITY   Sample values: ServicePacks | Important | Moderate      CLASSIFICATION   Sample values: ServicePacks | SecurityUpdates | DefinitionUpdates      PATCH_ID   Sample values: KB123456 | KB4516046     Linux   When specifying filters for Linux patches, you must specify a key-pair for PRODUCT. For example, using the Command Line Interface (CLI), the following command fails:  aws ssm describe-available-patches --filters Key=CVE_ID,Values=CVE-2018-3615  However, the following command succeeds:  aws ssm describe-available-patches --filters Key=PRODUCT,Values=AmazonLinux2018.03 Key=CVE_ID,Values=CVE-2018-3615   Supported keys for Linux managed node patches include the following:     PRODUCT   Sample values: AmazonLinux2018.03 | AmazonLinux2.0      NAME   Sample values: kernel-headers | samba-python | php      SEVERITY   Sample values: Critical | Important | Medium | Low      EPOCH   Sample values: 0 | 1      VERSION   Sample values: 78.6.1 | 4.10.16      RELEASE   Sample values: 9.56.amzn1 | 1.amzn2      ARCH   Sample values: i686 | x86_64      REPOSITORY   Sample values: Core | Updates      ADVISORY_ID   Sample values: ALAS-2018-1058 | ALAS2-2021-1594      CVE_ID   Sample values: CVE-2018-3615 | CVE-2020-1472      BUGZILLA_ID   Sample values: 1463241
        public let filters: [PatchOrchestratorFilter]?
        /// The maximum number of patches to return (per page).
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(filters: [PatchOrchestratorFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeAvailablePatchesResult: AWSDecodableShape {
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?
        /// An array of patches. Each entry in the array is a patch structure.
        public let patches: [Patch]?

        @inlinable
        public init(nextToken: String? = nil, patches: [Patch]? = nil) {
            self.nextToken = nextToken
            self.patches = patches
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case patches = "Patches"
        }
    }

    public struct DescribeDocumentPermissionRequest: AWSEncodableShape {
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The name of the document for which you are the owner.
        public let name: String
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The permission type for the document. The permission type can be Share.
        public let permissionType: DocumentPermissionType

        @inlinable
        public init(maxResults: Int? = nil, name: String, nextToken: String? = nil, permissionType: DocumentPermissionType) {
            self.maxResults = maxResults
            self.name = name
            self.nextToken = nextToken
            self.permissionType = permissionType
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 200)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case name = "Name"
            case nextToken = "NextToken"
            case permissionType = "PermissionType"
        }
    }

    public struct DescribeDocumentPermissionResponse: AWSDecodableShape {
        /// The account IDs that have permission to use this document. The ID can be either an Amazon Web Services account number or all.
        public let accountIds: [String]?
        /// A list of Amazon Web Services accounts where the current document is shared and the version shared with each account.
        public let accountSharingInfoList: [AccountSharingInfo]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(accountIds: [String]? = nil, accountSharingInfoList: [AccountSharingInfo]? = nil, nextToken: String? = nil) {
            self.accountIds = accountIds
            self.accountSharingInfoList = accountSharingInfoList
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case accountIds = "AccountIds"
            case accountSharingInfoList = "AccountSharingInfoList"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeDocumentRequest: AWSEncodableShape {
        /// The document version for which you want information. Can be a specific version or the default version.
        public let documentVersion: String?
        /// The name of the SSM document.  If you're calling a shared SSM document from a different Amazon Web Services account, Name is the full Amazon Resource Name (ARN) of the document.
        public let name: String
        /// An optional field specifying the version of the artifact associated with the document. For example, 12.6. This value is unique across all versions of a document, and can't be changed.
        public let versionName: String?

        @inlinable
        public init(documentVersion: String? = nil, name: String, versionName: String? = nil) {
            self.documentVersion = documentVersion
            self.name = name
            self.versionName = versionName
        }

        public func validate(name: String) throws {
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.:/]{3,128}$")
            try self.validate(self.versionName, name: "versionName", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{1,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case documentVersion = "DocumentVersion"
            case name = "Name"
            case versionName = "VersionName"
        }
    }

    public struct DescribeDocumentResult: AWSDecodableShape {
        /// Information about the SSM document.
        public let document: DocumentDescription?

        @inlinable
        public init(document: DocumentDescription? = nil) {
            self.document = document
        }

        private enum CodingKeys: String, CodingKey {
            case document = "Document"
        }
    }

    public struct DescribeEffectiveInstanceAssociationsRequest: AWSEncodableShape {
        /// The managed node ID for which you want to view all associations.
        public let instanceId: String
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(instanceId: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.instanceId = instanceId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 5)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeEffectiveInstanceAssociationsResult: AWSDecodableShape {
        /// The associations for the requested managed node.
        public let associations: [InstanceAssociation]?
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?

        @inlinable
        public init(associations: [InstanceAssociation]? = nil, nextToken: String? = nil) {
            self.associations = associations
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case associations = "Associations"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeEffectivePatchesForPatchBaselineRequest: AWSEncodableShape {
        /// The ID of the patch baseline to retrieve the effective patches for.
        public let baselineId: String
        /// The maximum number of patches to return (per page).
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(baselineId: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.baselineId = baselineId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.baselineId, name: "baselineId", parent: name, max: 128)
            try self.validate(self.baselineId, name: "baselineId", parent: name, min: 20)
            try self.validate(self.baselineId, name: "baselineId", parent: name, pattern: "^[a-zA-Z0-9_\\-:/]{20,128}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case baselineId = "BaselineId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeEffectivePatchesForPatchBaselineResult: AWSDecodableShape {
        /// An array of patches and patch status.
        public let effectivePatches: [EffectivePatch]?
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?

        @inlinable
        public init(effectivePatches: [EffectivePatch]? = nil, nextToken: String? = nil) {
            self.effectivePatches = effectivePatches
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case effectivePatches = "EffectivePatches"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeInstanceAssociationsStatusRequest: AWSEncodableShape {
        /// The managed node IDs for which you want association status information.
        public let instanceId: String
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(instanceId: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.instanceId = instanceId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeInstanceAssociationsStatusResult: AWSDecodableShape {
        /// Status information about the association.
        public let instanceAssociationStatusInfos: [InstanceAssociationStatusInfo]?
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?

        @inlinable
        public init(instanceAssociationStatusInfos: [InstanceAssociationStatusInfo]? = nil, nextToken: String? = nil) {
            self.instanceAssociationStatusInfos = instanceAssociationStatusInfos
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case instanceAssociationStatusInfos = "InstanceAssociationStatusInfos"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeInstanceInformationRequest: AWSEncodableShape {
        /// One or more filters. Use a filter to return a more specific list of managed nodes. You can filter based on tags applied to your managed nodes. Tag filters can't be combined with other filter types. Use this Filters data type instead of InstanceInformationFilterList, which is deprecated.
        public let filters: [InstanceInformationStringFilter]?
        /// This is a legacy method. We recommend that you don't use this method. Instead, use the Filters data type. Filters enables you to return node information by filtering based on tags applied to managed nodes.  Attempting to use InstanceInformationFilterList and Filters leads to an exception error.
        public let instanceInformationFilterList: [InstanceInformationFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results. The default value is 10 items.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(filters: [InstanceInformationStringFilter]? = nil, instanceInformationFilterList: [InstanceInformationFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.instanceInformationFilterList = instanceInformationFilterList
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.instanceInformationFilterList?.forEach {
                try $0.validate(name: "\(name).instanceInformationFilterList[]")
            }
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 5)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case instanceInformationFilterList = "InstanceInformationFilterList"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeInstanceInformationResult: AWSDecodableShape {
        /// The managed node information list.
        public let instanceInformationList: [InstanceInformation]?
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?

        @inlinable
        public init(instanceInformationList: [InstanceInformation]? = nil, nextToken: String? = nil) {
            self.instanceInformationList = instanceInformationList
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case instanceInformationList = "InstanceInformationList"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeInstancePatchStatesForPatchGroupRequest: AWSEncodableShape {
        /// Each entry in the array is a structure containing:   Key (string between 1 and 200 characters)   Values (array containing a single string)   Type (string "Equal", "NotEqual", "LessThan", "GreaterThan")
        public let filters: [InstancePatchStateFilter]?
        /// The maximum number of patches to return (per page).
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The name of the patch group for which the patch state information should be retrieved.
        public let patchGroup: String

        @inlinable
        public init(filters: [InstancePatchStateFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, patchGroup: String) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.patchGroup = patchGroup
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 4)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 10)
            try self.validate(self.patchGroup, name: "patchGroup", parent: name, max: 256)
            try self.validate(self.patchGroup, name: "patchGroup", parent: name, min: 1)
            try self.validate(self.patchGroup, name: "patchGroup", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case patchGroup = "PatchGroup"
        }
    }

    public struct DescribeInstancePatchStatesForPatchGroupResult: AWSDecodableShape {
        /// The high-level patch state for the requested managed nodes.
        public let instancePatchStates: [InstancePatchState]?
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?

        @inlinable
        public init(instancePatchStates: [InstancePatchState]? = nil, nextToken: String? = nil) {
            self.instancePatchStates = instancePatchStates
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case instancePatchStates = "InstancePatchStates"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeInstancePatchStatesRequest: AWSEncodableShape {
        /// The ID of the managed node for which patch state information should be retrieved.
        public let instanceIds: [String]
        /// The maximum number of managed nodes to return (per page).
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(instanceIds: [String], maxResults: Int? = nil, nextToken: String? = nil) {
            self.instanceIds = instanceIds
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.instanceIds.forEach {
                try validate($0, name: "instanceIds[]", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            }
            try self.validate(self.instanceIds, name: "instanceIds", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 10)
        }

        private enum CodingKeys: String, CodingKey {
            case instanceIds = "InstanceIds"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeInstancePatchStatesResult: AWSDecodableShape {
        /// The high-level patch state for the requested managed nodes.
        public let instancePatchStates: [InstancePatchState]?
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?

        @inlinable
        public init(instancePatchStates: [InstancePatchState]? = nil, nextToken: String? = nil) {
            self.instancePatchStates = instancePatchStates
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case instancePatchStates = "InstancePatchStates"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeInstancePatchesRequest: AWSEncodableShape {
        /// Each element in the array is a structure containing a key-value pair. Supported keys for DescribeInstancePatchesinclude the following:     Classification   Sample values: Security | SecurityUpdates      KBId   Sample values: KB4480056 | java-1.7.0-openjdk.x86_64      Severity   Sample values: Important | Medium | Low      State   Sample values: Installed | InstalledOther | InstalledPendingReboot  For lists of all State values, see Patch compliance state values in the Amazon Web Services Systems Manager User Guide.
        public let filters: [PatchOrchestratorFilter]?
        /// The ID of the managed node whose patch state information should be retrieved.
        public let instanceId: String
        /// The maximum number of patches to return (per page).
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(filters: [PatchOrchestratorFilter]? = nil, instanceId: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.instanceId = instanceId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 10)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case instanceId = "InstanceId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeInstancePatchesResult: AWSDecodableShape {
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?
        /// Each entry in the array is a structure containing:   Title (string)   KBId (string)   Classification (string)   Severity (string)   State (string, such as "INSTALLED" or "FAILED")   InstalledTime (DateTime)   InstalledBy (string)
        public let patches: [PatchComplianceData]?

        @inlinable
        public init(nextToken: String? = nil, patches: [PatchComplianceData]? = nil) {
            self.nextToken = nextToken
            self.patches = patches
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case patches = "Patches"
        }
    }

    public struct DescribeInstancePropertiesRequest: AWSEncodableShape {
        /// The request filters to use with the operator.
        public let filtersWithOperator: [InstancePropertyStringFilter]?
        /// An array of instance property filters.
        public let instancePropertyFilterList: [InstancePropertyFilter]?
        /// The maximum number of items to return for the call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token provided by a previous request to use to return the next set of properties.
        public let nextToken: String?

        @inlinable
        public init(filtersWithOperator: [InstancePropertyStringFilter]? = nil, instancePropertyFilterList: [InstancePropertyFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filtersWithOperator = filtersWithOperator
            self.instancePropertyFilterList = instancePropertyFilterList
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.filtersWithOperator?.forEach {
                try $0.validate(name: "\(name).filtersWithOperator[]")
            }
            try self.validate(self.filtersWithOperator, name: "filtersWithOperator", parent: name, max: 40)
            try self.validate(self.filtersWithOperator, name: "filtersWithOperator", parent: name, min: 1)
            try self.instancePropertyFilterList?.forEach {
                try $0.validate(name: "\(name).instancePropertyFilterList[]")
            }
            try self.validate(self.instancePropertyFilterList, name: "instancePropertyFilterList", parent: name, max: 40)
            try self.validate(self.instancePropertyFilterList, name: "instancePropertyFilterList", parent: name, min: 1)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 1000)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 5)
        }

        private enum CodingKeys: String, CodingKey {
            case filtersWithOperator = "FiltersWithOperator"
            case instancePropertyFilterList = "InstancePropertyFilterList"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeInstancePropertiesResult: AWSDecodableShape {
        /// Properties for the managed instances.
        public let instanceProperties: [InstanceProperty]?
        /// The token for the next set of properties to return. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(instanceProperties: [InstanceProperty]? = nil, nextToken: String? = nil) {
            self.instanceProperties = instanceProperties
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case instanceProperties = "InstanceProperties"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeInventoryDeletionsRequest: AWSEncodableShape {
        /// Specify the delete inventory ID for which you want information. This ID was returned by the DeleteInventory operation.
        public let deletionId: String?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(deletionId: String? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.deletionId = deletionId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.deletionId, name: "deletionId", parent: name, pattern: "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case deletionId = "DeletionId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeInventoryDeletionsResult: AWSDecodableShape {
        /// A list of status items for deleted inventory.
        public let inventoryDeletions: [InventoryDeletionStatusItem]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(inventoryDeletions: [InventoryDeletionStatusItem]? = nil, nextToken: String? = nil) {
            self.inventoryDeletions = inventoryDeletions
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case inventoryDeletions = "InventoryDeletions"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeMaintenanceWindowExecutionTaskInvocationsRequest: AWSEncodableShape {
        /// Optional filters used to scope down the returned task invocations. The supported filter key is STATUS with the corresponding values PENDING, IN_PROGRESS, SUCCESS, FAILED, TIMED_OUT, CANCELLING, and CANCELLED.
        public let filters: [MaintenanceWindowFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The ID of the specific task in the maintenance window task that should be retrieved.
        public let taskId: String
        /// The ID of the maintenance window execution the task is part of.
        public let windowExecutionId: String

        @inlinable
        public init(filters: [MaintenanceWindowFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, taskId: String, windowExecutionId: String) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.taskId = taskId
            self.windowExecutionId = windowExecutionId
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 10)
            try self.validate(self.taskId, name: "taskId", parent: name, max: 36)
            try self.validate(self.taskId, name: "taskId", parent: name, min: 36)
            try self.validate(self.taskId, name: "taskId", parent: name, pattern: "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$")
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, max: 36)
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, min: 36)
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, pattern: "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case taskId = "TaskId"
            case windowExecutionId = "WindowExecutionId"
        }
    }

    public struct DescribeMaintenanceWindowExecutionTaskInvocationsResult: AWSDecodableShape {
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?
        /// Information about the task invocation results per invocation.
        public let windowExecutionTaskInvocationIdentities: [MaintenanceWindowExecutionTaskInvocationIdentity]?

        @inlinable
        public init(nextToken: String? = nil, windowExecutionTaskInvocationIdentities: [MaintenanceWindowExecutionTaskInvocationIdentity]? = nil) {
            self.nextToken = nextToken
            self.windowExecutionTaskInvocationIdentities = windowExecutionTaskInvocationIdentities
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case windowExecutionTaskInvocationIdentities = "WindowExecutionTaskInvocationIdentities"
        }
    }

    public struct DescribeMaintenanceWindowExecutionTasksRequest: AWSEncodableShape {
        /// Optional filters used to scope down the returned tasks. The supported filter key is STATUS with the corresponding values PENDING, IN_PROGRESS, SUCCESS, FAILED, TIMED_OUT, CANCELLING, and CANCELLED.
        public let filters: [MaintenanceWindowFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The ID of the maintenance window execution whose task executions should be retrieved.
        public let windowExecutionId: String

        @inlinable
        public init(filters: [MaintenanceWindowFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, windowExecutionId: String) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.windowExecutionId = windowExecutionId
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 10)
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, max: 36)
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, min: 36)
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, pattern: "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case windowExecutionId = "WindowExecutionId"
        }
    }

    public struct DescribeMaintenanceWindowExecutionTasksResult: AWSDecodableShape {
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?
        /// Information about the task executions.
        public let windowExecutionTaskIdentities: [MaintenanceWindowExecutionTaskIdentity]?

        @inlinable
        public init(nextToken: String? = nil, windowExecutionTaskIdentities: [MaintenanceWindowExecutionTaskIdentity]? = nil) {
            self.nextToken = nextToken
            self.windowExecutionTaskIdentities = windowExecutionTaskIdentities
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case windowExecutionTaskIdentities = "WindowExecutionTaskIdentities"
        }
    }

    public struct DescribeMaintenanceWindowExecutionsRequest: AWSEncodableShape {
        /// Each entry in the array is a structure containing:   Key. A string between 1 and 128 characters. Supported keys include ExecutedBefore and ExecutedAfter.   Values. An array of strings, each between 1 and 256 characters. Supported values are date/time strings in a valid ISO 8601 date/time format, such as 2024-11-04T05:00:00Z.
        public let filters: [MaintenanceWindowFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The ID of the maintenance window whose executions should be retrieved.
        public let windowId: String

        @inlinable
        public init(filters: [MaintenanceWindowFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, windowId: String) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.windowId = windowId
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 10)
            try self.validate(self.windowId, name: "windowId", parent: name, max: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, min: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, pattern: "^mw-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case windowId = "WindowId"
        }
    }

    public struct DescribeMaintenanceWindowExecutionsResult: AWSDecodableShape {
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?
        /// Information about the maintenance window executions.
        public let windowExecutions: [MaintenanceWindowExecution]?

        @inlinable
        public init(nextToken: String? = nil, windowExecutions: [MaintenanceWindowExecution]? = nil) {
            self.nextToken = nextToken
            self.windowExecutions = windowExecutions
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case windowExecutions = "WindowExecutions"
        }
    }

    public struct DescribeMaintenanceWindowScheduleRequest: AWSEncodableShape {
        /// Filters used to limit the range of results. For example, you can limit maintenance window executions to only those scheduled before or after a certain date and time.
        public let filters: [PatchOrchestratorFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The type of resource you want to retrieve information about. For example, INSTANCE.
        public let resourceType: MaintenanceWindowResourceType?
        /// The managed node ID or key-value pair to retrieve information about.
        public let targets: [Target]?
        /// The ID of the maintenance window to retrieve information about.
        public let windowId: String?

        @inlinable
        public init(filters: [PatchOrchestratorFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, resourceType: MaintenanceWindowResourceType? = nil, targets: [Target]? = nil, windowId: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.resourceType = resourceType
            self.targets = targets
            self.windowId = windowId
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
            try self.validate(self.targets, name: "targets", parent: name, max: 5)
            try self.validate(self.windowId, name: "windowId", parent: name, max: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, min: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, pattern: "^mw-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case resourceType = "ResourceType"
            case targets = "Targets"
            case windowId = "WindowId"
        }
    }

    public struct DescribeMaintenanceWindowScheduleResult: AWSDecodableShape {
        /// The token for the next set of items to return. (You use this token in the next call.)
        public let nextToken: String?
        /// Information about maintenance window executions scheduled for the specified time range.
        public let scheduledWindowExecutions: [ScheduledWindowExecution]?

        @inlinable
        public init(nextToken: String? = nil, scheduledWindowExecutions: [ScheduledWindowExecution]? = nil) {
            self.nextToken = nextToken
            self.scheduledWindowExecutions = scheduledWindowExecutions
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case scheduledWindowExecutions = "ScheduledWindowExecutions"
        }
    }

    public struct DescribeMaintenanceWindowTargetsRequest: AWSEncodableShape {
        /// Optional filters that can be used to narrow down the scope of the returned window targets. The supported filter keys are Type, WindowTargetId, and OwnerInformation.
        public let filters: [MaintenanceWindowFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The ID of the maintenance window whose targets should be retrieved.
        public let windowId: String

        @inlinable
        public init(filters: [MaintenanceWindowFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, windowId: String) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.windowId = windowId
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 10)
            try self.validate(self.windowId, name: "windowId", parent: name, max: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, min: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, pattern: "^mw-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case windowId = "WindowId"
        }
    }

    public struct DescribeMaintenanceWindowTargetsResult: AWSDecodableShape {
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?
        /// Information about the targets in the maintenance window.
        public let targets: [MaintenanceWindowTarget]?

        @inlinable
        public init(nextToken: String? = nil, targets: [MaintenanceWindowTarget]? = nil) {
            self.nextToken = nextToken
            self.targets = targets
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case targets = "Targets"
        }
    }

    public struct DescribeMaintenanceWindowTasksRequest: AWSEncodableShape {
        /// Optional filters used to narrow down the scope of the returned tasks. The supported filter keys are WindowTaskId, TaskArn, Priority, and TaskType.
        public let filters: [MaintenanceWindowFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The ID of the maintenance window whose tasks should be retrieved.
        public let windowId: String

        @inlinable
        public init(filters: [MaintenanceWindowFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, windowId: String) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.windowId = windowId
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 10)
            try self.validate(self.windowId, name: "windowId", parent: name, max: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, min: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, pattern: "^mw-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case windowId = "WindowId"
        }
    }

    public struct DescribeMaintenanceWindowTasksResult: AWSDecodableShape {
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?
        /// Information about the tasks in the maintenance window.
        public let tasks: [MaintenanceWindowTask]?

        @inlinable
        public init(nextToken: String? = nil, tasks: [MaintenanceWindowTask]? = nil) {
            self.nextToken = nextToken
            self.tasks = tasks
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case tasks = "Tasks"
        }
    }

    public struct DescribeMaintenanceWindowsForTargetRequest: AWSEncodableShape {
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The type of resource you want to retrieve information about. For example, INSTANCE.
        public let resourceType: MaintenanceWindowResourceType
        /// The managed node ID or key-value pair to retrieve information about.
        public let targets: [Target]

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil, resourceType: MaintenanceWindowResourceType, targets: [Target]) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.resourceType = resourceType
            self.targets = targets
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.targets.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
            try self.validate(self.targets, name: "targets", parent: name, max: 5)
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case resourceType = "ResourceType"
            case targets = "Targets"
        }
    }

    public struct DescribeMaintenanceWindowsForTargetResult: AWSDecodableShape {
        /// The token for the next set of items to return. (You use this token in the next call.)
        public let nextToken: String?
        /// Information about the maintenance window targets and tasks a managed node is associated with.
        public let windowIdentities: [MaintenanceWindowIdentityForTarget]?

        @inlinable
        public init(nextToken: String? = nil, windowIdentities: [MaintenanceWindowIdentityForTarget]? = nil) {
            self.nextToken = nextToken
            self.windowIdentities = windowIdentities
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case windowIdentities = "WindowIdentities"
        }
    }

    public struct DescribeMaintenanceWindowsRequest: AWSEncodableShape {
        /// Optional filters used to narrow down the scope of the returned maintenance windows. Supported filter keys are Name and Enabled. For example, Name=MyMaintenanceWindow and Enabled=True.
        public let filters: [MaintenanceWindowFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(filters: [MaintenanceWindowFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 10)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeMaintenanceWindowsResult: AWSDecodableShape {
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?
        /// Information about the maintenance windows.
        public let windowIdentities: [MaintenanceWindowIdentity]?

        @inlinable
        public init(nextToken: String? = nil, windowIdentities: [MaintenanceWindowIdentity]? = nil) {
            self.nextToken = nextToken
            self.windowIdentities = windowIdentities
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case windowIdentities = "WindowIdentities"
        }
    }

    public struct DescribeOpsItemsRequest: AWSEncodableShape {
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?
        /// One or more filters to limit the response.   Key: CreatedTime Operations: GreaterThan, LessThan   Key: LastModifiedBy Operations: Contains, Equals   Key: LastModifiedTime Operations: GreaterThan, LessThan   Key: Priority Operations: Equals   Key: Source Operations: Contains, Equals   Key: Status Operations: Equals   Key: Title* Operations: Equals,Contains   Key: OperationalData** Operations: Equals   Key: OperationalDataKey Operations: Equals   Key: OperationalDataValue Operations: Equals, Contains   Key: OpsItemId Operations: Equals   Key: ResourceId Operations: Contains   Key: AutomationId Operations: Equals   Key: AccountId Operations: Equals   *The Equals operator for Title matches the first 100 characters. If you specify more than 100 characters, they system returns an error that the filter value exceeds the length limit. **If you filter the response by using the OperationalData operator, specify a key-value pair by using the following JSON format: {"key":"key_name","value":"a_value"}
        public let opsItemFilters: [OpsItemFilter]?

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil, opsItemFilters: [OpsItemFilter]? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.opsItemFilters = opsItemFilters
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case opsItemFilters = "OpsItemFilters"
        }
    }

    public struct DescribeOpsItemsResponse: AWSDecodableShape {
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?
        /// A list of OpsItems.
        public let opsItemSummaries: [OpsItemSummary]?

        @inlinable
        public init(nextToken: String? = nil, opsItemSummaries: [OpsItemSummary]? = nil) {
            self.nextToken = nextToken
            self.opsItemSummaries = opsItemSummaries
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case opsItemSummaries = "OpsItemSummaries"
        }
    }

    public struct DescribeParametersRequest: AWSEncodableShape {
        /// This data type is deprecated. Instead, use ParameterFilters.
        public let filters: [ParametersFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// Filters to limit the request results.
        public let parameterFilters: [ParameterStringFilter]?
        /// Lists parameters that are shared with you.  By default when using this option, the command returns parameters that have been shared using a standard Resource Access Manager Resource Share. In order for a parameter that was shared using the PutResourcePolicy command to be returned, the associated RAM Resource Share Created From Policy must have been promoted to a standard Resource Share using the RAM PromoteResourceShareCreatedFromPolicy API operation. For more information about sharing parameters, see Working with shared parameters in the Amazon Web Services Systems Manager User Guide.
        public let shared: Bool?

        @inlinable
        public init(filters: [ParametersFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, parameterFilters: [ParameterStringFilter]? = nil, shared: Bool? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.parameterFilters = parameterFilters
            self.shared = shared
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.parameterFilters?.forEach {
                try $0.validate(name: "\(name).parameterFilters[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case parameterFilters = "ParameterFilters"
            case shared = "Shared"
        }
    }

    public struct DescribeParametersResult: AWSDecodableShape {
        /// The token to use when requesting the next set of items.
        public let nextToken: String?
        /// Parameters returned by the request.
        public let parameters: [ParameterMetadata]?

        @inlinable
        public init(nextToken: String? = nil, parameters: [ParameterMetadata]? = nil) {
            self.nextToken = nextToken
            self.parameters = parameters
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case parameters = "Parameters"
        }
    }

    public struct DescribePatchBaselinesRequest: AWSEncodableShape {
        /// Each element in the array is a structure containing a key-value pair. Supported keys for DescribePatchBaselines include the following:     NAME_PREFIX   Sample values: AWS- | My-      OWNER   Sample values: AWS | Self      OPERATING_SYSTEM   Sample values: AMAZON_LINUX | SUSE | WINDOWS
        public let filters: [PatchOrchestratorFilter]?
        /// The maximum number of patch baselines to return (per page).
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(filters: [PatchOrchestratorFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribePatchBaselinesResult: AWSDecodableShape {
        /// An array of PatchBaselineIdentity elements.
        public let baselineIdentities: [PatchBaselineIdentity]?
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?

        @inlinable
        public init(baselineIdentities: [PatchBaselineIdentity]? = nil, nextToken: String? = nil) {
            self.baselineIdentities = baselineIdentities
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case baselineIdentities = "BaselineIdentities"
            case nextToken = "NextToken"
        }
    }

    public struct DescribePatchGroupStateRequest: AWSEncodableShape {
        /// The name of the patch group whose patch snapshot should be retrieved.
        public let patchGroup: String

        @inlinable
        public init(patchGroup: String) {
            self.patchGroup = patchGroup
        }

        public func validate(name: String) throws {
            try self.validate(self.patchGroup, name: "patchGroup", parent: name, max: 256)
            try self.validate(self.patchGroup, name: "patchGroup", parent: name, min: 1)
            try self.validate(self.patchGroup, name: "patchGroup", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
        }

        private enum CodingKeys: String, CodingKey {
            case patchGroup = "PatchGroup"
        }
    }

    public struct DescribePatchGroupStateResult: AWSDecodableShape {
        /// The number of managed nodes in the patch group.
        public let instances: Int?
        /// The number of managed nodes for which security-related patches are available but not approved because because they didn't meet the patch baseline requirements. For example, an updated version of a patch might have been released before the specified auto-approval period was over. Applies to Windows Server managed nodes only.
        public let instancesWithAvailableSecurityUpdates: Int?
        /// The number of managed nodes where patches that are specified as Critical for compliance reporting in the patch baseline aren't installed. These patches might be missing, have failed installation, were rejected, or were installed but awaiting a required managed node reboot. The status of these managed nodes is NON_COMPLIANT.
        public let instancesWithCriticalNonCompliantPatches: Int?
        /// The number of managed nodes with patches from the patch baseline that failed to install.
        public let instancesWithFailedPatches: Int?
        /// The number of managed nodes with patches installed that aren't defined in the patch baseline.
        public let instancesWithInstalledOtherPatches: Int?
        /// The number of managed nodes with installed patches.
        public let instancesWithInstalledPatches: Int?
        /// The number of managed nodes with patches installed by Patch Manager that haven't been rebooted after the patch installation. The status of these managed nodes is NON_COMPLIANT.
        public let instancesWithInstalledPendingRebootPatches: Int?
        /// The number of managed nodes with patches installed that are specified in a RejectedPatches list. Patches with a status of INSTALLED_REJECTED were typically installed before they were added to a RejectedPatches list.  If ALLOW_AS_DEPENDENCY is the specified option for RejectedPatchesAction, the value of InstancesWithInstalledRejectedPatches will always be 0 (zero).
        public let instancesWithInstalledRejectedPatches: Int?
        /// The number of managed nodes with missing patches from the patch baseline.
        public let instancesWithMissingPatches: Int?
        /// The number of managed nodes with patches that aren't applicable.
        public let instancesWithNotApplicablePatches: Int?
        /// The number of managed nodes with patches installed that are specified as other than Critical or Security but aren't compliant with the patch baseline. The status of these managed nodes is NON_COMPLIANT.
        public let instancesWithOtherNonCompliantPatches: Int?
        /// The number of managed nodes where patches that are specified as Security in a patch advisory aren't installed. These patches might be missing, have failed installation, were rejected, or were installed but awaiting a required managed node reboot. The status of these managed nodes is NON_COMPLIANT.
        public let instancesWithSecurityNonCompliantPatches: Int?
        /// The number of managed nodes with NotApplicable patches beyond the supported limit, which aren't reported by name to Inventory. Inventory is a tool in Amazon Web Services Systems Manager.
        public let instancesWithUnreportedNotApplicablePatches: Int?

        @inlinable
        public init(instances: Int? = nil, instancesWithAvailableSecurityUpdates: Int? = nil, instancesWithCriticalNonCompliantPatches: Int? = nil, instancesWithFailedPatches: Int? = nil, instancesWithInstalledOtherPatches: Int? = nil, instancesWithInstalledPatches: Int? = nil, instancesWithInstalledPendingRebootPatches: Int? = nil, instancesWithInstalledRejectedPatches: Int? = nil, instancesWithMissingPatches: Int? = nil, instancesWithNotApplicablePatches: Int? = nil, instancesWithOtherNonCompliantPatches: Int? = nil, instancesWithSecurityNonCompliantPatches: Int? = nil, instancesWithUnreportedNotApplicablePatches: Int? = nil) {
            self.instances = instances
            self.instancesWithAvailableSecurityUpdates = instancesWithAvailableSecurityUpdates
            self.instancesWithCriticalNonCompliantPatches = instancesWithCriticalNonCompliantPatches
            self.instancesWithFailedPatches = instancesWithFailedPatches
            self.instancesWithInstalledOtherPatches = instancesWithInstalledOtherPatches
            self.instancesWithInstalledPatches = instancesWithInstalledPatches
            self.instancesWithInstalledPendingRebootPatches = instancesWithInstalledPendingRebootPatches
            self.instancesWithInstalledRejectedPatches = instancesWithInstalledRejectedPatches
            self.instancesWithMissingPatches = instancesWithMissingPatches
            self.instancesWithNotApplicablePatches = instancesWithNotApplicablePatches
            self.instancesWithOtherNonCompliantPatches = instancesWithOtherNonCompliantPatches
            self.instancesWithSecurityNonCompliantPatches = instancesWithSecurityNonCompliantPatches
            self.instancesWithUnreportedNotApplicablePatches = instancesWithUnreportedNotApplicablePatches
        }

        private enum CodingKeys: String, CodingKey {
            case instances = "Instances"
            case instancesWithAvailableSecurityUpdates = "InstancesWithAvailableSecurityUpdates"
            case instancesWithCriticalNonCompliantPatches = "InstancesWithCriticalNonCompliantPatches"
            case instancesWithFailedPatches = "InstancesWithFailedPatches"
            case instancesWithInstalledOtherPatches = "InstancesWithInstalledOtherPatches"
            case instancesWithInstalledPatches = "InstancesWithInstalledPatches"
            case instancesWithInstalledPendingRebootPatches = "InstancesWithInstalledPendingRebootPatches"
            case instancesWithInstalledRejectedPatches = "InstancesWithInstalledRejectedPatches"
            case instancesWithMissingPatches = "InstancesWithMissingPatches"
            case instancesWithNotApplicablePatches = "InstancesWithNotApplicablePatches"
            case instancesWithOtherNonCompliantPatches = "InstancesWithOtherNonCompliantPatches"
            case instancesWithSecurityNonCompliantPatches = "InstancesWithSecurityNonCompliantPatches"
            case instancesWithUnreportedNotApplicablePatches = "InstancesWithUnreportedNotApplicablePatches"
        }
    }

    public struct DescribePatchGroupsRequest: AWSEncodableShape {
        /// Each element in the array is a structure containing a key-value pair. Supported keys for DescribePatchGroups include the following:     NAME_PREFIX   Sample values: AWS- | My-.     OPERATING_SYSTEM   Sample values: AMAZON_LINUX | SUSE | WINDOWS
        public let filters: [PatchOrchestratorFilter]?
        /// The maximum number of patch groups to return (per page).
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(filters: [PatchOrchestratorFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribePatchGroupsResult: AWSDecodableShape {
        /// Each entry in the array contains:    PatchGroup: string (between 1 and 256 characters. Regex: ^([\p{L}\p{Z}\p{N}_.:/=+\-@]*)$)     PatchBaselineIdentity: A PatchBaselineIdentity element.
        public let mappings: [PatchGroupPatchBaselineMapping]?
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?

        @inlinable
        public init(mappings: [PatchGroupPatchBaselineMapping]? = nil, nextToken: String? = nil) {
            self.mappings = mappings
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case mappings = "Mappings"
            case nextToken = "NextToken"
        }
    }

    public struct DescribePatchPropertiesRequest: AWSEncodableShape {
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The operating system type for which to list patches.
        public let operatingSystem: OperatingSystem
        /// Indicates whether to list patches for the Windows operating system or for applications released by Microsoft. Not applicable for the Linux or macOS operating systems.
        public let patchSet: PatchSet?
        /// The patch property for which you want to view patch details.
        public let property: PatchProperty

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil, operatingSystem: OperatingSystem, patchSet: PatchSet? = nil, property: PatchProperty) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.operatingSystem = operatingSystem
            self.patchSet = patchSet
            self.property = property
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case operatingSystem = "OperatingSystem"
            case patchSet = "PatchSet"
            case property = "Property"
        }
    }

    public struct DescribePatchPropertiesResult: AWSDecodableShape {
        /// The token for the next set of items to return. (You use this token in the next call.)
        public let nextToken: String?
        /// A list of the properties for patches matching the filter request parameters.
        public let properties: [[String: String]]?

        @inlinable
        public init(nextToken: String? = nil, properties: [[String: String]]? = nil) {
            self.nextToken = nextToken
            self.properties = properties
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case properties = "Properties"
        }
    }

    public struct DescribeSessionsRequest: AWSEncodableShape {
        /// One or more filters to limit the type of sessions returned by the request.
        public let filters: [SessionFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The session status to retrieve a list of sessions for. For example, "Active".
        public let state: SessionState

        @inlinable
        public init(filters: [SessionFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, state: SessionState) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.state = state
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 6)
            try self.validate(self.filters, name: "filters", parent: name, min: 1)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 200)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case state = "State"
        }
    }

    public struct DescribeSessionsResponse: AWSDecodableShape {
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// A list of sessions meeting the request parameters.
        public let sessions: [Session]?

        @inlinable
        public init(nextToken: String? = nil, sessions: [Session]? = nil) {
            self.nextToken = nextToken
            self.sessions = sessions
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case sessions = "Sessions"
        }
    }

    public struct DisassociateOpsItemRelatedItemRequest: AWSEncodableShape {
        /// The ID of the association for which you want to delete an association between the OpsItem and a related item.
        public let associationId: String
        /// The ID of the OpsItem for which you want to delete an association between the OpsItem and a related item.
        public let opsItemId: String

        @inlinable
        public init(associationId: String, opsItemId: String) {
            self.associationId = associationId
            self.opsItemId = opsItemId
        }

        public func validate(name: String) throws {
            try self.validate(self.opsItemId, name: "opsItemId", parent: name, pattern: "^(oi)-[0-9a-f]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case associationId = "AssociationId"
            case opsItemId = "OpsItemId"
        }
    }

    public struct DisassociateOpsItemRelatedItemResponse: AWSDecodableShape {
        public init() {}
    }

    public struct DocumentDefaultVersionDescription: AWSDecodableShape {
        /// The default version of the document.
        public let defaultVersion: String?
        /// The default version of the artifact associated with the document.
        public let defaultVersionName: String?
        /// The name of the document.
        public let name: String?

        @inlinable
        public init(defaultVersion: String? = nil, defaultVersionName: String? = nil, name: String? = nil) {
            self.defaultVersion = defaultVersion
            self.defaultVersionName = defaultVersionName
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case defaultVersion = "DefaultVersion"
            case defaultVersionName = "DefaultVersionName"
            case name = "Name"
        }
    }

    public struct DocumentDescription: AWSDecodableShape {
        /// The version of the document currently approved for use in the organization.
        public let approvedVersion: String?
        /// Details about the document attachments, including names, locations, sizes, and so on.
        public let attachmentsInformation: [AttachmentInformation]?
        /// The user in your organization who created the document.
        public let author: String?
        /// The classification of a document to help you identify and categorize its use.
        public let category: [String]?
        /// The value that identifies a document's category.
        public let categoryEnum: [String]?
        /// The date when the document was created.
        public let createdDate: Date?
        /// The default version.
        public let defaultVersion: String?
        /// A description of the document.
        public let description: String?
        /// The friendly name of the SSM document. This value can differ for each version of the document. If you want to update this value, see UpdateDocument.
        public let displayName: String?
        /// The document format, either JSON or YAML.
        public let documentFormat: DocumentFormat?
        /// The type of document.
        public let documentType: DocumentType?
        /// The document version.
        public let documentVersion: String?
        /// The Sha256 or Sha1 hash created by the system when the document was created.   Sha1 hashes have been deprecated.
        public let hash: String?
        /// The hash type of the document. Valid values include Sha256 or Sha1.  Sha1 hashes have been deprecated.
        public let hashType: DocumentHashType?
        /// The latest version of the document.
        public let latestVersion: String?
        /// The name of the SSM document.
        public let name: String?
        /// The Amazon Web Services user that created the document.
        public let owner: String?
        /// A description of the parameters for a document.
        public let parameters: [DocumentParameter]?
        /// The version of the document that is currently under review.
        public let pendingReviewVersion: String?
        /// The list of operating system (OS) platforms compatible with this SSM document.
        public let platformTypes: [PlatformType]?
        /// A list of SSM documents required by a document. For example, an ApplicationConfiguration document requires an ApplicationConfigurationSchema document.
        public let requires: [DocumentRequires]?
        /// Details about the review of a document.
        public let reviewInformation: [ReviewInformation]?
        /// The current status of the review.
        public let reviewStatus: ReviewStatus?
        /// The schema version.
        public let schemaVersion: String?
        /// The SHA1 hash of the document, which you can use for verification.
        public let sha1: String?
        /// The status of the SSM document.
        public let status: DocumentStatus?
        /// A message returned by Amazon Web Services Systems Manager that explains the Status value. For example, a Failed status might be explained by the StatusInformation message, "The specified S3 bucket doesn't exist. Verify that the URL of the S3 bucket is correct."
        public let statusInformation: String?
        /// The tags, or metadata, that have been applied to the document.
        public let tags: [Tag]?
        /// The target type which defines the kinds of resources the document can run on. For example, /AWS::EC2::Instance. For a list of valid resource types, see Amazon Web Services resource and property types reference in the CloudFormation User Guide.
        public let targetType: String?
        /// The version of the artifact associated with the document.
        public let versionName: String?

        @inlinable
        public init(approvedVersion: String? = nil, attachmentsInformation: [AttachmentInformation]? = nil, author: String? = nil, category: [String]? = nil, categoryEnum: [String]? = nil, createdDate: Date? = nil, defaultVersion: String? = nil, description: String? = nil, displayName: String? = nil, documentFormat: DocumentFormat? = nil, documentType: DocumentType? = nil, documentVersion: String? = nil, hash: String? = nil, hashType: DocumentHashType? = nil, latestVersion: String? = nil, name: String? = nil, owner: String? = nil, parameters: [DocumentParameter]? = nil, pendingReviewVersion: String? = nil, platformTypes: [PlatformType]? = nil, requires: [DocumentRequires]? = nil, reviewInformation: [ReviewInformation]? = nil, reviewStatus: ReviewStatus? = nil, schemaVersion: String? = nil, sha1: String? = nil, status: DocumentStatus? = nil, statusInformation: String? = nil, tags: [Tag]? = nil, targetType: String? = nil, versionName: String? = nil) {
            self.approvedVersion = approvedVersion
            self.attachmentsInformation = attachmentsInformation
            self.author = author
            self.category = category
            self.categoryEnum = categoryEnum
            self.createdDate = createdDate
            self.defaultVersion = defaultVersion
            self.description = description
            self.displayName = displayName
            self.documentFormat = documentFormat
            self.documentType = documentType
            self.documentVersion = documentVersion
            self.hash = hash
            self.hashType = hashType
            self.latestVersion = latestVersion
            self.name = name
            self.owner = owner
            self.parameters = parameters
            self.pendingReviewVersion = pendingReviewVersion
            self.platformTypes = platformTypes
            self.requires = requires
            self.reviewInformation = reviewInformation
            self.reviewStatus = reviewStatus
            self.schemaVersion = schemaVersion
            self.sha1 = sha1
            self.status = status
            self.statusInformation = statusInformation
            self.tags = tags
            self.targetType = targetType
            self.versionName = versionName
        }

        private enum CodingKeys: String, CodingKey {
            case approvedVersion = "ApprovedVersion"
            case attachmentsInformation = "AttachmentsInformation"
            case author = "Author"
            case category = "Category"
            case categoryEnum = "CategoryEnum"
            case createdDate = "CreatedDate"
            case defaultVersion = "DefaultVersion"
            case description = "Description"
            case displayName = "DisplayName"
            case documentFormat = "DocumentFormat"
            case documentType = "DocumentType"
            case documentVersion = "DocumentVersion"
            case hash = "Hash"
            case hashType = "HashType"
            case latestVersion = "LatestVersion"
            case name = "Name"
            case owner = "Owner"
            case parameters = "Parameters"
            case pendingReviewVersion = "PendingReviewVersion"
            case platformTypes = "PlatformTypes"
            case requires = "Requires"
            case reviewInformation = "ReviewInformation"
            case reviewStatus = "ReviewStatus"
            case schemaVersion = "SchemaVersion"
            case sha1 = "Sha1"
            case status = "Status"
            case statusInformation = "StatusInformation"
            case tags = "Tags"
            case targetType = "TargetType"
            case versionName = "VersionName"
        }
    }

    public struct DocumentFilter: AWSEncodableShape {
        /// The name of the filter.
        public let key: DocumentFilterKey
        /// The value of the filter.
        public let value: String

        @inlinable
        public init(key: DocumentFilterKey, value: String) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.value, name: "value", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "key"
            case value = "value"
        }
    }

    public struct DocumentIdentifier: AWSDecodableShape {
        /// The user in your organization who created the document.
        public let author: String?
        /// The date the SSM document was created.
        public let createdDate: Date?
        /// An optional field where you can specify a friendly name for the SSM document. This value can differ for each version of the document. If you want to update this value, see UpdateDocument.
        public let displayName: String?
        /// The document format, either JSON or YAML.
        public let documentFormat: DocumentFormat?
        /// The document type.
        public let documentType: DocumentType?
        /// The document version.
        public let documentVersion: String?
        /// The name of the SSM document.
        public let name: String?
        /// The Amazon Web Services user that created the document.
        public let owner: String?
        /// The operating system platform.
        public let platformTypes: [PlatformType]?
        /// A list of SSM documents required by a document. For example, an ApplicationConfiguration document requires an ApplicationConfigurationSchema document.
        public let requires: [DocumentRequires]?
        /// The current status of a document review.
        public let reviewStatus: ReviewStatus?
        /// The schema version.
        public let schemaVersion: String?
        /// The tags, or metadata, that have been applied to the document.
        public let tags: [Tag]?
        /// The target type which defines the kinds of resources the document can run on. For example, /AWS::EC2::Instance. For a list of valid resource types, see Amazon Web Services resource and property types reference in the CloudFormation User Guide.
        public let targetType: String?
        /// An optional field specifying the version of the artifact associated with the document. For example, 12.6. This value is unique across all versions of a document, and can't be changed.
        public let versionName: String?

        @inlinable
        public init(author: String? = nil, createdDate: Date? = nil, displayName: String? = nil, documentFormat: DocumentFormat? = nil, documentType: DocumentType? = nil, documentVersion: String? = nil, name: String? = nil, owner: String? = nil, platformTypes: [PlatformType]? = nil, requires: [DocumentRequires]? = nil, reviewStatus: ReviewStatus? = nil, schemaVersion: String? = nil, tags: [Tag]? = nil, targetType: String? = nil, versionName: String? = nil) {
            self.author = author
            self.createdDate = createdDate
            self.displayName = displayName
            self.documentFormat = documentFormat
            self.documentType = documentType
            self.documentVersion = documentVersion
            self.name = name
            self.owner = owner
            self.platformTypes = platformTypes
            self.requires = requires
            self.reviewStatus = reviewStatus
            self.schemaVersion = schemaVersion
            self.tags = tags
            self.targetType = targetType
            self.versionName = versionName
        }

        private enum CodingKeys: String, CodingKey {
            case author = "Author"
            case createdDate = "CreatedDate"
            case displayName = "DisplayName"
            case documentFormat = "DocumentFormat"
            case documentType = "DocumentType"
            case documentVersion = "DocumentVersion"
            case name = "Name"
            case owner = "Owner"
            case platformTypes = "PlatformTypes"
            case requires = "Requires"
            case reviewStatus = "ReviewStatus"
            case schemaVersion = "SchemaVersion"
            case tags = "Tags"
            case targetType = "TargetType"
            case versionName = "VersionName"
        }
    }

    public struct DocumentKeyValuesFilter: AWSEncodableShape {
        /// The name of the filter key.
        public let key: String?
        /// The value for the filter key.
        public let values: [String]?

        @inlinable
        public init(key: String? = nil, values: [String]? = nil) {
            self.key = key
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 128)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.values?.forEach {
                try validate($0, name: "values[]", parent: name, max: 256)
                try validate($0, name: "values[]", parent: name, min: 1)
            }
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case values = "Values"
        }
    }

    public struct DocumentMetadataResponseInfo: AWSDecodableShape {
        /// Details about a reviewer's response to a document review request.
        public let reviewerResponse: [DocumentReviewerResponseSource]?

        @inlinable
        public init(reviewerResponse: [DocumentReviewerResponseSource]? = nil) {
            self.reviewerResponse = reviewerResponse
        }

        private enum CodingKeys: String, CodingKey {
            case reviewerResponse = "ReviewerResponse"
        }
    }

    public struct DocumentParameter: AWSDecodableShape {
        /// If specified, the default values for the parameters. Parameters without a default value are required. Parameters with a default value are optional.
        public let defaultValue: String?
        /// A description of what the parameter does, how to use it, the default value, and whether or not the parameter is optional.
        public let description: String?
        /// The name of the parameter.
        public let name: String?
        /// The type of parameter. The type can be either String or StringList.
        public let type: DocumentParameterType?

        @inlinable
        public init(defaultValue: String? = nil, description: String? = nil, name: String? = nil, type: DocumentParameterType? = nil) {
            self.defaultValue = defaultValue
            self.description = description
            self.name = name
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case defaultValue = "DefaultValue"
            case description = "Description"
            case name = "Name"
            case type = "Type"
        }
    }

    public struct DocumentRequires: AWSEncodableShape & AWSDecodableShape {
        /// The name of the required SSM document. The name can be an Amazon Resource Name (ARN).
        public let name: String
        /// The document type of the required SSM document.
        public let requireType: String?
        /// The document version required by the current document.
        public let version: String?
        /// An optional field specifying the version of the artifact associated with the document. For example, 12.6. This value is unique across all versions of a document, and can't be changed.
        public let versionName: String?

        @inlinable
        public init(name: String, requireType: String? = nil, version: String? = nil, versionName: String? = nil) {
            self.name = name
            self.requireType = requireType
            self.version = version
            self.versionName = versionName
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.:/]{3,128}$")
            try self.validate(self.requireType, name: "requireType", parent: name, max: 128)
            try self.validate(self.requireType, name: "requireType", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{1,128}$")
            try self.validate(self.version, name: "version", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.validate(self.versionName, name: "versionName", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{1,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case requireType = "RequireType"
            case version = "Version"
            case versionName = "VersionName"
        }
    }

    public struct DocumentReviewCommentSource: AWSEncodableShape & AWSDecodableShape {
        /// The content of a comment entered by a user who requests a review of a new document version, or who reviews the new version.
        public let content: String?
        /// The type of information added to a review request. Currently, only the value Comment is supported.
        public let type: DocumentReviewCommentType?

        @inlinable
        public init(content: String? = nil, type: DocumentReviewCommentType? = nil) {
            self.content = content
            self.type = type
        }

        public func validate(name: String) throws {
            try self.validate(self.content, name: "content", parent: name, max: 1024)
            try self.validate(self.content, name: "content", parent: name, min: 1)
            try self.validate(self.content, name: "content", parent: name, pattern: "^(?!\\s*$).+$")
        }

        private enum CodingKeys: String, CodingKey {
            case content = "Content"
            case type = "Type"
        }
    }

    public struct DocumentReviewerResponseSource: AWSDecodableShape {
        /// The comment entered by a reviewer as part of their document review response.
        public let comment: [DocumentReviewCommentSource]?
        /// The date and time that a reviewer entered a response to a document review request.
        public let createTime: Date?
        /// The user in your organization assigned to review a document request.
        public let reviewer: String?
        /// The current review status of a new custom SSM document created by a member of your organization, or of the latest version of an existing SSM document. Only one version of a document can be in the APPROVED state at a time. When a new version is approved, the status of the previous version changes to REJECTED. Only one version of a document can be in review, or PENDING, at a time.
        public let reviewStatus: ReviewStatus?
        /// The date and time that a reviewer last updated a response to a document review request.
        public let updatedTime: Date?

        @inlinable
        public init(comment: [DocumentReviewCommentSource]? = nil, createTime: Date? = nil, reviewer: String? = nil, reviewStatus: ReviewStatus? = nil, updatedTime: Date? = nil) {
            self.comment = comment
            self.createTime = createTime
            self.reviewer = reviewer
            self.reviewStatus = reviewStatus
            self.updatedTime = updatedTime
        }

        private enum CodingKeys: String, CodingKey {
            case comment = "Comment"
            case createTime = "CreateTime"
            case reviewer = "Reviewer"
            case reviewStatus = "ReviewStatus"
            case updatedTime = "UpdatedTime"
        }
    }

    public struct DocumentReviews: AWSEncodableShape {
        /// The action to take on a document approval review request.
        public let action: DocumentReviewAction
        /// A comment entered by a user in your organization about the document review request.
        public let comment: [DocumentReviewCommentSource]?

        @inlinable
        public init(action: DocumentReviewAction, comment: [DocumentReviewCommentSource]? = nil) {
            self.action = action
            self.comment = comment
        }

        public func validate(name: String) throws {
            try self.comment?.forEach {
                try $0.validate(name: "\(name).comment[]")
            }
            try self.validate(self.comment, name: "comment", parent: name, max: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case action = "Action"
            case comment = "Comment"
        }
    }

    public struct DocumentVersionInfo: AWSDecodableShape {
        /// The date the document was created.
        public let createdDate: Date?
        /// The friendly name of the SSM document. This value can differ for each version of the document. If you want to update this value, see UpdateDocument.
        public let displayName: String?
        /// The document format, either JSON or YAML.
        public let documentFormat: DocumentFormat?
        /// The document version.
        public let documentVersion: String?
        /// An identifier for the default version of the document.
        public let isDefaultVersion: Bool?
        /// The document name.
        public let name: String?
        /// The current status of the approval review for the latest version of the document.
        public let reviewStatus: ReviewStatus?
        /// The status of the SSM document, such as Creating, Active, Failed, and Deleting.
        public let status: DocumentStatus?
        /// A message returned by Amazon Web Services Systems Manager that explains the Status value. For example, a Failed status might be explained by the StatusInformation message, "The specified S3 bucket doesn't exist. Verify that the URL of the S3 bucket is correct."
        public let statusInformation: String?
        /// The version of the artifact associated with the document. For example, 12.6. This value is unique across all versions of a document, and can't be changed.
        public let versionName: String?

        @inlinable
        public init(createdDate: Date? = nil, displayName: String? = nil, documentFormat: DocumentFormat? = nil, documentVersion: String? = nil, isDefaultVersion: Bool? = nil, name: String? = nil, reviewStatus: ReviewStatus? = nil, status: DocumentStatus? = nil, statusInformation: String? = nil, versionName: String? = nil) {
            self.createdDate = createdDate
            self.displayName = displayName
            self.documentFormat = documentFormat
            self.documentVersion = documentVersion
            self.isDefaultVersion = isDefaultVersion
            self.name = name
            self.reviewStatus = reviewStatus
            self.status = status
            self.statusInformation = statusInformation
            self.versionName = versionName
        }

        private enum CodingKeys: String, CodingKey {
            case createdDate = "CreatedDate"
            case displayName = "DisplayName"
            case documentFormat = "DocumentFormat"
            case documentVersion = "DocumentVersion"
            case isDefaultVersion = "IsDefaultVersion"
            case name = "Name"
            case reviewStatus = "ReviewStatus"
            case status = "Status"
            case statusInformation = "StatusInformation"
            case versionName = "VersionName"
        }
    }

    public struct EffectivePatch: AWSDecodableShape {
        /// Provides metadata for a patch, including information such as the KB ID, severity, classification and a URL for where more information can be obtained about the patch.
        public let patch: Patch?
        /// The status of the patch in a patch baseline. This includes information about whether the patch is currently approved, due to be approved by a rule, explicitly approved, or explicitly rejected and the date the patch was or will be approved.
        public let patchStatus: PatchStatus?

        @inlinable
        public init(patch: Patch? = nil, patchStatus: PatchStatus? = nil) {
            self.patch = patch
            self.patchStatus = patchStatus
        }

        private enum CodingKeys: String, CodingKey {
            case patch = "Patch"
            case patchStatus = "PatchStatus"
        }
    }

    public struct FailedCreateAssociation: AWSDecodableShape {
        /// The association.
        public let entry: CreateAssociationBatchRequestEntry?
        /// The source of the failure.
        public let fault: Fault?
        /// A description of the failure.
        public let message: String?

        @inlinable
        public init(entry: CreateAssociationBatchRequestEntry? = nil, fault: Fault? = nil, message: String? = nil) {
            self.entry = entry
            self.fault = fault
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case entry = "Entry"
            case fault = "Fault"
            case message = "Message"
        }
    }

    public struct FailureDetails: AWSDecodableShape {
        /// Detailed information about the Automation step failure.
        public let details: [String: [String]]?
        /// The stage of the Automation execution when the failure occurred. The stages include the following: InputValidation, PreVerification, Invocation, PostVerification.
        public let failureStage: String?
        /// The type of Automation failure. Failure types include the following: Action, Permission, Throttling, Verification, Internal.
        public let failureType: String?

        @inlinable
        public init(details: [String: [String]]? = nil, failureStage: String? = nil, failureType: String? = nil) {
            self.details = details
            self.failureStage = failureStage
            self.failureType = failureType
        }

        private enum CodingKeys: String, CodingKey {
            case details = "Details"
            case failureStage = "FailureStage"
            case failureType = "FailureType"
        }
    }

    public struct GetAccessTokenRequest: AWSEncodableShape {
        /// The ID of a just-in-time node access request.
        public let accessRequestId: String

        @inlinable
        public init(accessRequestId: String) {
            self.accessRequestId = accessRequestId
        }

        public func validate(name: String) throws {
            try self.validate(self.accessRequestId, name: "accessRequestId", parent: name, pattern: "^(oi)-[0-9a-f]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case accessRequestId = "AccessRequestId"
        }
    }

    public struct GetAccessTokenResponse: AWSDecodableShape {
        /// The status of the access request.
        public let accessRequestStatus: AccessRequestStatus?
        /// The temporary security credentials which can be used to start just-in-time node access sessions.
        public let credentials: Credentials?

        @inlinable
        public init(accessRequestStatus: AccessRequestStatus? = nil, credentials: Credentials? = nil) {
            self.accessRequestStatus = accessRequestStatus
            self.credentials = credentials
        }

        private enum CodingKeys: String, CodingKey {
            case accessRequestStatus = "AccessRequestStatus"
            case credentials = "Credentials"
        }
    }

    public struct GetAutomationExecutionRequest: AWSEncodableShape {
        /// The unique identifier for an existing automation execution to examine. The execution ID is returned by StartAutomationExecution when the execution of an Automation runbook is initiated.
        public let automationExecutionId: String

        @inlinable
        public init(automationExecutionId: String) {
            self.automationExecutionId = automationExecutionId
        }

        public func validate(name: String) throws {
            try self.validate(self.automationExecutionId, name: "automationExecutionId", parent: name, max: 36)
            try self.validate(self.automationExecutionId, name: "automationExecutionId", parent: name, min: 36)
        }

        private enum CodingKeys: String, CodingKey {
            case automationExecutionId = "AutomationExecutionId"
        }
    }

    public struct GetAutomationExecutionResult: AWSDecodableShape {
        /// Detailed information about the current state of an automation execution.
        public let automationExecution: AutomationExecution?

        @inlinable
        public init(automationExecution: AutomationExecution? = nil) {
            self.automationExecution = automationExecution
        }

        private enum CodingKeys: String, CodingKey {
            case automationExecution = "AutomationExecution"
        }
    }

    public struct GetCalendarStateRequest: AWSEncodableShape {
        /// (Optional) The specific time for which you want to get calendar state information, in ISO 8601 format. If you don't specify a value or AtTime, the current time is used.
        public let atTime: String?
        /// The names of Amazon Resource Names (ARNs) of the Systems Manager documents (SSM documents) that represent the calendar entries for which you want to get the state.
        public let calendarNames: [String]

        @inlinable
        public init(atTime: String? = nil, calendarNames: [String]) {
            self.atTime = atTime
            self.calendarNames = calendarNames
        }

        private enum CodingKeys: String, CodingKey {
            case atTime = "AtTime"
            case calendarNames = "CalendarNames"
        }
    }

    public struct GetCalendarStateResponse: AWSDecodableShape {
        /// The time, as an ISO 8601 string, that you specified in your command. If you don't specify a time, GetCalendarState uses the current time.
        public let atTime: String?
        /// The time, as an ISO 8601 string, that the calendar state will change. If the current calendar state is OPEN, NextTransitionTime indicates when the calendar state changes to CLOSED, and vice-versa.
        public let nextTransitionTime: String?
        /// The state of the calendar. An OPEN calendar indicates that actions are allowed to proceed, and a CLOSED calendar indicates that actions aren't allowed to proceed.
        public let state: CalendarState?

        @inlinable
        public init(atTime: String? = nil, nextTransitionTime: String? = nil, state: CalendarState? = nil) {
            self.atTime = atTime
            self.nextTransitionTime = nextTransitionTime
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case atTime = "AtTime"
            case nextTransitionTime = "NextTransitionTime"
            case state = "State"
        }
    }

    public struct GetCommandInvocationRequest: AWSEncodableShape {
        /// (Required) The parent command ID of the invocation plugin.
        public let commandId: String
        /// (Required) The ID of the managed node targeted by the command. A managed node can be an Amazon Elastic Compute Cloud (Amazon EC2) instance, edge device, and on-premises server or VM in your hybrid environment that is configured for Amazon Web Services Systems Manager.
        public let instanceId: String
        /// The name of the step for which you want detailed results. If the document contains only one step, you can omit the name and details for that step. If the document contains more than one step, you must specify the name of the step for which you want to view details. Be sure to specify the name of the step, not the name of a plugin like aws:RunShellScript. To find the PluginName, check the document content and find the name of the step you want details for. Alternatively, use ListCommandInvocations with the CommandId and Details parameters. The PluginName is the Name attribute of the CommandPlugin object in the CommandPlugins list.
        public let pluginName: String?

        @inlinable
        public init(commandId: String, instanceId: String, pluginName: String? = nil) {
            self.commandId = commandId
            self.instanceId = instanceId
            self.pluginName = pluginName
        }

        public func validate(name: String) throws {
            try self.validate(self.commandId, name: "commandId", parent: name, max: 36)
            try self.validate(self.commandId, name: "commandId", parent: name, min: 36)
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            try self.validate(self.pluginName, name: "pluginName", parent: name, min: 4)
        }

        private enum CodingKeys: String, CodingKey {
            case commandId = "CommandId"
            case instanceId = "InstanceId"
            case pluginName = "PluginName"
        }
    }

    public struct GetCommandInvocationResult: AWSDecodableShape {
        /// Amazon CloudWatch Logs information where Systems Manager sent the command output.
        public let cloudWatchOutputConfig: CloudWatchOutputConfig?
        /// The parent command ID of the invocation plugin.
        public let commandId: String?
        /// The comment text for the command.
        public let comment: String?
        /// The name of the document that was run. For example, AWS-RunShellScript.
        public let documentName: String?
        /// The Systems Manager document (SSM document) version used in the request.
        public let documentVersion: String?
        /// Duration since ExecutionStartDateTime.
        public let executionElapsedTime: String?
        /// The date and time the plugin finished running. Date and time are written in ISO 8601 format. For example, June 7, 2017 is represented as 2017-06-7. The following sample Amazon Web Services CLI command uses the InvokedAfter filter.  aws ssm list-commands --filters key=InvokedAfter,value=2017-06-07T00:00:00Z  If the plugin hasn't started to run, the string is empty.
        public let executionEndDateTime: String?
        /// The date and time the plugin started running. Date and time are written in ISO 8601 format. For example, June 7, 2017 is represented as 2017-06-7. The following sample Amazon Web Services CLI command uses the InvokedBefore filter.  aws ssm list-commands --filters key=InvokedBefore,value=2017-06-07T00:00:00Z  If the plugin hasn't started to run, the string is empty.
        public let executionStartDateTime: String?
        /// The ID of the managed node targeted by the command. A managed node can be an Amazon Elastic Compute Cloud (Amazon EC2) instance, edge device, or on-premises server or VM in your hybrid environment that is configured for Amazon Web Services Systems Manager.
        public let instanceId: String?
        /// The name of the plugin, or step name, for which details are reported. For example, aws:RunShellScript is a plugin.
        public let pluginName: String?
        /// The error level response code for the plugin script. If the response code is -1, then the command hasn't started running on the managed node, or it wasn't received by the node.
        public let responseCode: Int?
        /// The first 8,000 characters written by the plugin to stderr. If the command hasn't finished running, then this string is empty.
        public let standardErrorContent: String?
        /// The URL for the complete text written by the plugin to stderr. If the command hasn't finished running, then this string is empty.
        public let standardErrorUrl: String?
        /// The first 24,000 characters written by the plugin to stdout. If the command hasn't finished running, if ExecutionStatus is neither Succeeded nor Failed, then this string is empty.
        public let standardOutputContent: String?
        /// The URL for the complete text written by the plugin to stdout in Amazon Simple Storage Service (Amazon S3). If an S3 bucket wasn't specified, then this string is empty.
        public let standardOutputUrl: String?
        /// The status of this invocation plugin. This status can be different than StatusDetails.
        public let status: CommandInvocationStatus?
        /// A detailed status of the command execution for an invocation. StatusDetails includes more information than Status because it includes states resulting from error and concurrency control parameters. StatusDetails can show different results than Status. For more information about these statuses, see Understanding command statuses in the Amazon Web Services Systems Manager User Guide. StatusDetails can be one of the following values:   Pending: The command hasn't been sent to the managed node.   In Progress: The command has been sent to the managed node but hasn't reached a terminal state.   Delayed: The system attempted to send the command to the target, but the target wasn't available. The managed node might not be available because of network issues, because the node was stopped, or for similar reasons. The system will try to send the command again.   Success: The command or plugin ran successfully. This is a terminal state.   Delivery Timed Out: The command wasn't delivered to the managed node before the delivery timeout expired. Delivery timeouts don't count against the parent command's MaxErrors limit, but they do contribute to whether the parent command status is Success or Incomplete. This is a terminal state.   Execution Timed Out: The command started to run on the managed node, but the execution wasn't complete before the timeout expired. Execution timeouts count against the MaxErrors limit of the parent command. This is a terminal state.   Failed: The command wasn't run successfully on the managed node. For a plugin, this indicates that the result code wasn't zero. For a command invocation, this indicates that the result code for one or more plugins wasn't zero. Invocation failures count against the MaxErrors limit of the parent command. This is a terminal state.   Cancelled: The command was terminated before it was completed. This is a terminal state.   Undeliverable: The command can't be delivered to the managed node. The node might not exist or might not be responding. Undeliverable invocations don't count against the parent command's MaxErrors limit and don't contribute to whether the parent command status is Success or Incomplete. This is a terminal state.   Terminated: The parent command exceeded its MaxErrors limit and subsequent command invocations were canceled by the system. This is a terminal state.
        public let statusDetails: String?

        @inlinable
        public init(cloudWatchOutputConfig: CloudWatchOutputConfig? = nil, commandId: String? = nil, comment: String? = nil, documentName: String? = nil, documentVersion: String? = nil, executionElapsedTime: String? = nil, executionEndDateTime: String? = nil, executionStartDateTime: String? = nil, instanceId: String? = nil, pluginName: String? = nil, responseCode: Int? = nil, standardErrorContent: String? = nil, standardErrorUrl: String? = nil, standardOutputContent: String? = nil, standardOutputUrl: String? = nil, status: CommandInvocationStatus? = nil, statusDetails: String? = nil) {
            self.cloudWatchOutputConfig = cloudWatchOutputConfig
            self.commandId = commandId
            self.comment = comment
            self.documentName = documentName
            self.documentVersion = documentVersion
            self.executionElapsedTime = executionElapsedTime
            self.executionEndDateTime = executionEndDateTime
            self.executionStartDateTime = executionStartDateTime
            self.instanceId = instanceId
            self.pluginName = pluginName
            self.responseCode = responseCode
            self.standardErrorContent = standardErrorContent
            self.standardErrorUrl = standardErrorUrl
            self.standardOutputContent = standardOutputContent
            self.standardOutputUrl = standardOutputUrl
            self.status = status
            self.statusDetails = statusDetails
        }

        private enum CodingKeys: String, CodingKey {
            case cloudWatchOutputConfig = "CloudWatchOutputConfig"
            case commandId = "CommandId"
            case comment = "Comment"
            case documentName = "DocumentName"
            case documentVersion = "DocumentVersion"
            case executionElapsedTime = "ExecutionElapsedTime"
            case executionEndDateTime = "ExecutionEndDateTime"
            case executionStartDateTime = "ExecutionStartDateTime"
            case instanceId = "InstanceId"
            case pluginName = "PluginName"
            case responseCode = "ResponseCode"
            case standardErrorContent = "StandardErrorContent"
            case standardErrorUrl = "StandardErrorUrl"
            case standardOutputContent = "StandardOutputContent"
            case standardOutputUrl = "StandardOutputUrl"
            case status = "Status"
            case statusDetails = "StatusDetails"
        }
    }

    public struct GetConnectionStatusRequest: AWSEncodableShape {
        /// The managed node ID.
        public let target: String

        @inlinable
        public init(target: String) {
            self.target = target
        }

        public func validate(name: String) throws {
            try self.validate(self.target, name: "target", parent: name, max: 400)
            try self.validate(self.target, name: "target", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case target = "Target"
        }
    }

    public struct GetConnectionStatusResponse: AWSDecodableShape {
        /// The status of the connection to the managed node.
        public let status: ConnectionStatus?
        /// The ID of the managed node to check connection status.
        public let target: String?

        @inlinable
        public init(status: ConnectionStatus? = nil, target: String? = nil) {
            self.status = status
            self.target = target
        }

        private enum CodingKeys: String, CodingKey {
            case status = "Status"
            case target = "Target"
        }
    }

    public struct GetDefaultPatchBaselineRequest: AWSEncodableShape {
        /// Returns the default patch baseline for the specified operating system.
        public let operatingSystem: OperatingSystem?

        @inlinable
        public init(operatingSystem: OperatingSystem? = nil) {
            self.operatingSystem = operatingSystem
        }

        private enum CodingKeys: String, CodingKey {
            case operatingSystem = "OperatingSystem"
        }
    }

    public struct GetDefaultPatchBaselineResult: AWSDecodableShape {
        /// The ID of the default patch baseline.
        public let baselineId: String?
        /// The operating system for the returned patch baseline.
        public let operatingSystem: OperatingSystem?

        @inlinable
        public init(baselineId: String? = nil, operatingSystem: OperatingSystem? = nil) {
            self.baselineId = baselineId
            self.operatingSystem = operatingSystem
        }

        private enum CodingKeys: String, CodingKey {
            case baselineId = "BaselineId"
            case operatingSystem = "OperatingSystem"
        }
    }

    public struct GetDeployablePatchSnapshotForInstanceRequest: AWSEncodableShape {
        /// Defines the basic information about a patch baseline override.
        public let baselineOverride: BaselineOverride?
        /// The ID of the managed node for which the appropriate patch snapshot should be retrieved.
        public let instanceId: String
        /// The snapshot ID provided by the user when running AWS-RunPatchBaseline.
        public let snapshotId: String

        @inlinable
        public init(baselineOverride: BaselineOverride? = nil, instanceId: String, snapshotId: String) {
            self.baselineOverride = baselineOverride
            self.instanceId = instanceId
            self.snapshotId = snapshotId
        }

        public func validate(name: String) throws {
            try self.baselineOverride?.validate(name: "\(name).baselineOverride")
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            try self.validate(self.snapshotId, name: "snapshotId", parent: name, max: 36)
            try self.validate(self.snapshotId, name: "snapshotId", parent: name, min: 36)
            try self.validate(self.snapshotId, name: "snapshotId", parent: name, pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case baselineOverride = "BaselineOverride"
            case instanceId = "InstanceId"
            case snapshotId = "SnapshotId"
        }
    }

    public struct GetDeployablePatchSnapshotForInstanceResult: AWSDecodableShape {
        /// The managed node ID.
        public let instanceId: String?
        /// Returns the specific operating system (for example Windows Server 2012 or Amazon Linux 2015.09) on the managed node for the specified patch snapshot.
        public let product: String?
        /// A pre-signed Amazon Simple Storage Service (Amazon S3) URL that can be used to download the patch snapshot.
        public let snapshotDownloadUrl: String?
        /// The user-defined snapshot ID.
        public let snapshotId: String?

        @inlinable
        public init(instanceId: String? = nil, product: String? = nil, snapshotDownloadUrl: String? = nil, snapshotId: String? = nil) {
            self.instanceId = instanceId
            self.product = product
            self.snapshotDownloadUrl = snapshotDownloadUrl
            self.snapshotId = snapshotId
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
            case product = "Product"
            case snapshotDownloadUrl = "SnapshotDownloadUrl"
            case snapshotId = "SnapshotId"
        }
    }

    public struct GetDocumentRequest: AWSEncodableShape {
        /// Returns the document in the specified format. The document format can be either JSON or YAML. JSON is the default format.
        public let documentFormat: DocumentFormat?
        /// The document version for which you want information.
        public let documentVersion: String?
        /// The name of the SSM document.
        public let name: String
        /// An optional field specifying the version of the artifact associated with the document. For example, 12.6. This value is unique across all versions of a document and can't be changed.
        public let versionName: String?

        @inlinable
        public init(documentFormat: DocumentFormat? = nil, documentVersion: String? = nil, name: String, versionName: String? = nil) {
            self.documentFormat = documentFormat
            self.documentVersion = documentVersion
            self.name = name
            self.versionName = versionName
        }

        public func validate(name: String) throws {
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.:/]{3,128}$")
            try self.validate(self.versionName, name: "versionName", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{1,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case documentFormat = "DocumentFormat"
            case documentVersion = "DocumentVersion"
            case name = "Name"
            case versionName = "VersionName"
        }
    }

    public struct GetDocumentResult: AWSDecodableShape {
        /// A description of the document attachments, including names, locations, sizes, and so on.
        public let attachmentsContent: [AttachmentContent]?
        /// The contents of the SSM document.
        public let content: String?
        /// The date the SSM document was created.
        public let createdDate: Date?
        /// The friendly name of the SSM document. This value can differ for each version of the document. If you want to update this value, see UpdateDocument.
        public let displayName: String?
        /// The document format, either JSON or YAML.
        public let documentFormat: DocumentFormat?
        /// The document type.
        public let documentType: DocumentType?
        /// The document version.
        public let documentVersion: String?
        /// The name of the SSM document.
        public let name: String?
        /// A list of SSM documents required by a document. For example, an ApplicationConfiguration document requires an ApplicationConfigurationSchema document.
        public let requires: [DocumentRequires]?
        /// The current review status of a new custom Systems Manager document (SSM document) created by a member of your organization, or of the latest version of an existing SSM document. Only one version of an SSM document can be in the APPROVED state at a time. When a new version is approved, the status of the previous version changes to REJECTED. Only one version of an SSM document can be in review, or PENDING, at a time.
        public let reviewStatus: ReviewStatus?
        /// The status of the SSM document, such as Creating, Active, Updating, Failed, and Deleting.
        public let status: DocumentStatus?
        /// A message returned by Amazon Web Services Systems Manager that explains the Status value. For example, a Failed status might be explained by the StatusInformation message, "The specified S3 bucket doesn't exist. Verify that the URL of the S3 bucket is correct."
        public let statusInformation: String?
        /// The version of the artifact associated with the document. For example, 12.6. This value is unique across all versions of a document, and can't be changed.
        public let versionName: String?

        @inlinable
        public init(attachmentsContent: [AttachmentContent]? = nil, content: String? = nil, createdDate: Date? = nil, displayName: String? = nil, documentFormat: DocumentFormat? = nil, documentType: DocumentType? = nil, documentVersion: String? = nil, name: String? = nil, requires: [DocumentRequires]? = nil, reviewStatus: ReviewStatus? = nil, status: DocumentStatus? = nil, statusInformation: String? = nil, versionName: String? = nil) {
            self.attachmentsContent = attachmentsContent
            self.content = content
            self.createdDate = createdDate
            self.displayName = displayName
            self.documentFormat = documentFormat
            self.documentType = documentType
            self.documentVersion = documentVersion
            self.name = name
            self.requires = requires
            self.reviewStatus = reviewStatus
            self.status = status
            self.statusInformation = statusInformation
            self.versionName = versionName
        }

        private enum CodingKeys: String, CodingKey {
            case attachmentsContent = "AttachmentsContent"
            case content = "Content"
            case createdDate = "CreatedDate"
            case displayName = "DisplayName"
            case documentFormat = "DocumentFormat"
            case documentType = "DocumentType"
            case documentVersion = "DocumentVersion"
            case name = "Name"
            case requires = "Requires"
            case reviewStatus = "ReviewStatus"
            case status = "Status"
            case statusInformation = "StatusInformation"
            case versionName = "VersionName"
        }
    }

    public struct GetExecutionPreviewRequest: AWSEncodableShape {
        /// The ID of the existing execution preview.
        public let executionPreviewId: String

        @inlinable
        public init(executionPreviewId: String) {
            self.executionPreviewId = executionPreviewId
        }

        public func validate(name: String) throws {
            try self.validate(self.executionPreviewId, name: "executionPreviewId", parent: name, max: 36)
            try self.validate(self.executionPreviewId, name: "executionPreviewId", parent: name, min: 36)
            try self.validate(self.executionPreviewId, name: "executionPreviewId", parent: name, pattern: "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case executionPreviewId = "ExecutionPreviewId"
        }
    }

    public struct GetExecutionPreviewResponse: AWSDecodableShape {
        /// A UTC timestamp indicating when the execution preview operation ended.
        public let endedAt: Date?
        public let executionPreview: ExecutionPreview?
        /// The generated ID for the existing execution preview.
        public let executionPreviewId: String?
        /// The current status of the execution preview operation.
        public let status: ExecutionPreviewStatus?
        /// Supplemental information about the current status of the execution preview.
        public let statusMessage: String?

        @inlinable
        public init(endedAt: Date? = nil, executionPreview: ExecutionPreview? = nil, executionPreviewId: String? = nil, status: ExecutionPreviewStatus? = nil, statusMessage: String? = nil) {
            self.endedAt = endedAt
            self.executionPreview = executionPreview
            self.executionPreviewId = executionPreviewId
            self.status = status
            self.statusMessage = statusMessage
        }

        private enum CodingKeys: String, CodingKey {
            case endedAt = "EndedAt"
            case executionPreview = "ExecutionPreview"
            case executionPreviewId = "ExecutionPreviewId"
            case status = "Status"
            case statusMessage = "StatusMessage"
        }
    }

    public struct GetInventoryRequest: AWSEncodableShape {
        /// Returns counts of inventory types based on one or more expressions. For example, if you aggregate by using an expression that uses the AWS:InstanceInformation.PlatformType type, you can see a count of how many Windows and Linux managed nodes exist in your inventoried fleet.
        public let aggregators: [InventoryAggregator]?
        /// One or more filters. Use a filter to return a more specific list of results.
        public let filters: [InventoryFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The list of inventory item types to return.
        public let resultAttributes: [ResultAttribute]?

        @inlinable
        public init(aggregators: [InventoryAggregator]? = nil, filters: [InventoryFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, resultAttributes: [ResultAttribute]? = nil) {
            self.aggregators = aggregators
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.resultAttributes = resultAttributes
        }

        public func validate(name: String) throws {
            try self.aggregators?.forEach {
                try $0.validate(name: "\(name).aggregators[]")
            }
            try self.validate(self.aggregators, name: "aggregators", parent: name, max: 10)
            try self.validate(self.aggregators, name: "aggregators", parent: name, min: 1)
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.filters, name: "filters", parent: name, min: 1)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.resultAttributes?.forEach {
                try $0.validate(name: "\(name).resultAttributes[]")
            }
            try self.validate(self.resultAttributes, name: "resultAttributes", parent: name, max: 1)
            try self.validate(self.resultAttributes, name: "resultAttributes", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case aggregators = "Aggregators"
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case resultAttributes = "ResultAttributes"
        }
    }

    public struct GetInventoryResult: AWSDecodableShape {
        /// Collection of inventory entities such as a collection of managed node inventory.
        public let entities: [InventoryResultEntity]?
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?

        @inlinable
        public init(entities: [InventoryResultEntity]? = nil, nextToken: String? = nil) {
            self.entities = entities
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case entities = "Entities"
            case nextToken = "NextToken"
        }
    }

    public struct GetInventorySchemaRequest: AWSEncodableShape {
        /// Returns inventory schemas that support aggregation. For example, this call returns the AWS:InstanceInformation type, because it supports aggregation based on the PlatformName, PlatformType, and PlatformVersion attributes.
        public let aggregator: Bool?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// Returns the sub-type schema for a specified inventory type.
        public let subType: Bool?
        /// The type of inventory item to return.
        public let typeName: String?

        @inlinable
        public init(aggregator: Bool? = nil, maxResults: Int? = nil, nextToken: String? = nil, subType: Bool? = nil, typeName: String? = nil) {
            self.aggregator = aggregator
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.subType = subType
            self.typeName = typeName
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 200)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 50)
            try self.validate(self.typeName, name: "typeName", parent: name, max: 100)
        }

        private enum CodingKeys: String, CodingKey {
            case aggregator = "Aggregator"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case subType = "SubType"
            case typeName = "TypeName"
        }
    }

    public struct GetInventorySchemaResult: AWSDecodableShape {
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?
        /// Inventory schemas returned by the request.
        public let schemas: [InventoryItemSchema]?

        @inlinable
        public init(nextToken: String? = nil, schemas: [InventoryItemSchema]? = nil) {
            self.nextToken = nextToken
            self.schemas = schemas
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case schemas = "Schemas"
        }
    }

    public struct GetMaintenanceWindowExecutionRequest: AWSEncodableShape {
        /// The ID of the maintenance window execution that includes the task.
        public let windowExecutionId: String

        @inlinable
        public init(windowExecutionId: String) {
            self.windowExecutionId = windowExecutionId
        }

        public func validate(name: String) throws {
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, max: 36)
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, min: 36)
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, pattern: "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case windowExecutionId = "WindowExecutionId"
        }
    }

    public struct GetMaintenanceWindowExecutionResult: AWSDecodableShape {
        /// The time the maintenance window finished running.
        public let endTime: Date?
        /// The time the maintenance window started running.
        public let startTime: Date?
        /// The status of the maintenance window execution.
        public let status: MaintenanceWindowExecutionStatus?
        /// The details explaining the status. Not available for all status values.
        public let statusDetails: String?
        /// The ID of the task executions from the maintenance window execution.
        public let taskIds: [String]?
        /// The ID of the maintenance window execution.
        public let windowExecutionId: String?

        @inlinable
        public init(endTime: Date? = nil, startTime: Date? = nil, status: MaintenanceWindowExecutionStatus? = nil, statusDetails: String? = nil, taskIds: [String]? = nil, windowExecutionId: String? = nil) {
            self.endTime = endTime
            self.startTime = startTime
            self.status = status
            self.statusDetails = statusDetails
            self.taskIds = taskIds
            self.windowExecutionId = windowExecutionId
        }

        private enum CodingKeys: String, CodingKey {
            case endTime = "EndTime"
            case startTime = "StartTime"
            case status = "Status"
            case statusDetails = "StatusDetails"
            case taskIds = "TaskIds"
            case windowExecutionId = "WindowExecutionId"
        }
    }

    public struct GetMaintenanceWindowExecutionTaskInvocationRequest: AWSEncodableShape {
        /// The invocation ID to retrieve.
        public let invocationId: String
        /// The ID of the specific task in the maintenance window task that should be retrieved.
        public let taskId: String
        /// The ID of the maintenance window execution for which the task is a part.
        public let windowExecutionId: String

        @inlinable
        public init(invocationId: String, taskId: String, windowExecutionId: String) {
            self.invocationId = invocationId
            self.taskId = taskId
            self.windowExecutionId = windowExecutionId
        }

        public func validate(name: String) throws {
            try self.validate(self.invocationId, name: "invocationId", parent: name, max: 36)
            try self.validate(self.invocationId, name: "invocationId", parent: name, min: 36)
            try self.validate(self.invocationId, name: "invocationId", parent: name, pattern: "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$")
            try self.validate(self.taskId, name: "taskId", parent: name, max: 36)
            try self.validate(self.taskId, name: "taskId", parent: name, min: 36)
            try self.validate(self.taskId, name: "taskId", parent: name, pattern: "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$")
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, max: 36)
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, min: 36)
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, pattern: "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case invocationId = "InvocationId"
            case taskId = "TaskId"
            case windowExecutionId = "WindowExecutionId"
        }
    }

    public struct GetMaintenanceWindowExecutionTaskInvocationResult: AWSDecodableShape {
        /// The time that the task finished running on the target.
        public let endTime: Date?
        /// The execution ID.
        public let executionId: String?
        /// The invocation ID.
        public let invocationId: String?
        /// User-provided value to be included in any Amazon CloudWatch Events or Amazon EventBridge events raised while running tasks for these targets in this maintenance window.
        public let ownerInformation: String?
        /// The parameters used at the time that the task ran.
        public let parameters: String?
        /// The time that the task started running on the target.
        public let startTime: Date?
        /// The task status for an invocation.
        public let status: MaintenanceWindowExecutionStatus?
        /// The details explaining the status. Details are only available for certain status values.
        public let statusDetails: String?
        /// The task execution ID.
        public let taskExecutionId: String?
        /// Retrieves the task type for a maintenance window.
        public let taskType: MaintenanceWindowTaskType?
        /// The maintenance window execution ID.
        public let windowExecutionId: String?
        /// The maintenance window target ID.
        public let windowTargetId: String?

        @inlinable
        public init(endTime: Date? = nil, executionId: String? = nil, invocationId: String? = nil, ownerInformation: String? = nil, parameters: String? = nil, startTime: Date? = nil, status: MaintenanceWindowExecutionStatus? = nil, statusDetails: String? = nil, taskExecutionId: String? = nil, taskType: MaintenanceWindowTaskType? = nil, windowExecutionId: String? = nil, windowTargetId: String? = nil) {
            self.endTime = endTime
            self.executionId = executionId
            self.invocationId = invocationId
            self.ownerInformation = ownerInformation
            self.parameters = parameters
            self.startTime = startTime
            self.status = status
            self.statusDetails = statusDetails
            self.taskExecutionId = taskExecutionId
            self.taskType = taskType
            self.windowExecutionId = windowExecutionId
            self.windowTargetId = windowTargetId
        }

        private enum CodingKeys: String, CodingKey {
            case endTime = "EndTime"
            case executionId = "ExecutionId"
            case invocationId = "InvocationId"
            case ownerInformation = "OwnerInformation"
            case parameters = "Parameters"
            case startTime = "StartTime"
            case status = "Status"
            case statusDetails = "StatusDetails"
            case taskExecutionId = "TaskExecutionId"
            case taskType = "TaskType"
            case windowExecutionId = "WindowExecutionId"
            case windowTargetId = "WindowTargetId"
        }
    }

    public struct GetMaintenanceWindowExecutionTaskRequest: AWSEncodableShape {
        /// The ID of the specific task execution in the maintenance window task that should be retrieved.
        public let taskId: String
        /// The ID of the maintenance window execution that includes the task.
        public let windowExecutionId: String

        @inlinable
        public init(taskId: String, windowExecutionId: String) {
            self.taskId = taskId
            self.windowExecutionId = windowExecutionId
        }

        public func validate(name: String) throws {
            try self.validate(self.taskId, name: "taskId", parent: name, max: 36)
            try self.validate(self.taskId, name: "taskId", parent: name, min: 36)
            try self.validate(self.taskId, name: "taskId", parent: name, pattern: "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$")
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, max: 36)
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, min: 36)
            try self.validate(self.windowExecutionId, name: "windowExecutionId", parent: name, pattern: "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case taskId = "TaskId"
            case windowExecutionId = "WindowExecutionId"
        }
    }

    public struct GetMaintenanceWindowExecutionTaskResult: AWSDecodableShape {
        /// The details for the CloudWatch alarm you applied to your maintenance window task.
        public let alarmConfiguration: AlarmConfiguration?
        /// The time the task execution completed.
        public let endTime: Date?
        /// The defined maximum number of task executions that could be run in parallel.
        public let maxConcurrency: String?
        /// The defined maximum number of task execution errors allowed before scheduling of the task execution would have been stopped.
        public let maxErrors: String?
        /// The priority of the task.
        public let priority: Int?
        /// The role that was assumed when running the task.
        public let serviceRole: String?
        /// The time the task execution started.
        public let startTime: Date?
        /// The status of the task.
        public let status: MaintenanceWindowExecutionStatus?
        /// The details explaining the status. Not available for all status values.
        public let statusDetails: String?
        /// The Amazon Resource Name (ARN) of the task that ran.
        public let taskArn: String?
        /// The ID of the specific task execution in the maintenance window task that was retrieved.
        public let taskExecutionId: String?
        /// The parameters passed to the task when it was run.   TaskParameters has been deprecated. To specify parameters to pass to a task when it runs, instead use the Parameters option in the TaskInvocationParameters structure. For information about how Systems Manager handles these options for the supported maintenance window task types, see MaintenanceWindowTaskInvocationParameters.  The map has the following format:    Key: string, between 1 and 255 characters    Value: an array of strings, each between 1 and 255 characters
        public let taskParameters: [[String: MaintenanceWindowTaskParameterValueExpression]]?
        /// The CloudWatch alarms that were invoked by the maintenance window task.
        public let triggeredAlarms: [AlarmStateInformation]?
        /// The type of task that was run.
        public let type: MaintenanceWindowTaskType?
        /// The ID of the maintenance window execution that includes the task.
        public let windowExecutionId: String?

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, endTime: Date? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, priority: Int? = nil, serviceRole: String? = nil, startTime: Date? = nil, status: MaintenanceWindowExecutionStatus? = nil, statusDetails: String? = nil, taskArn: String? = nil, taskExecutionId: String? = nil, taskParameters: [[String: MaintenanceWindowTaskParameterValueExpression]]? = nil, triggeredAlarms: [AlarmStateInformation]? = nil, type: MaintenanceWindowTaskType? = nil, windowExecutionId: String? = nil) {
            self.alarmConfiguration = alarmConfiguration
            self.endTime = endTime
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.priority = priority
            self.serviceRole = serviceRole
            self.startTime = startTime
            self.status = status
            self.statusDetails = statusDetails
            self.taskArn = taskArn
            self.taskExecutionId = taskExecutionId
            self.taskParameters = taskParameters
            self.triggeredAlarms = triggeredAlarms
            self.type = type
            self.windowExecutionId = windowExecutionId
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case endTime = "EndTime"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case priority = "Priority"
            case serviceRole = "ServiceRole"
            case startTime = "StartTime"
            case status = "Status"
            case statusDetails = "StatusDetails"
            case taskArn = "TaskArn"
            case taskExecutionId = "TaskExecutionId"
            case taskParameters = "TaskParameters"
            case triggeredAlarms = "TriggeredAlarms"
            case type = "Type"
            case windowExecutionId = "WindowExecutionId"
        }
    }

    public struct GetMaintenanceWindowRequest: AWSEncodableShape {
        /// The ID of the maintenance window for which you want to retrieve information.
        public let windowId: String

        @inlinable
        public init(windowId: String) {
            self.windowId = windowId
        }

        public func validate(name: String) throws {
            try self.validate(self.windowId, name: "windowId", parent: name, max: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, min: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, pattern: "^mw-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case windowId = "WindowId"
        }
    }

    public struct GetMaintenanceWindowResult: AWSDecodableShape {
        /// Whether targets must be registered with the maintenance window before tasks can be defined for those targets.
        public let allowUnassociatedTargets: Bool?
        /// The date the maintenance window was created.
        public let createdDate: Date?
        /// The number of hours before the end of the maintenance window that Amazon Web Services Systems Manager stops scheduling new tasks for execution.
        public let cutoff: Int?
        /// The description of the maintenance window.
        public let description: String?
        /// The duration of the maintenance window in hours.
        public let duration: Int?
        /// Indicates whether the maintenance window is enabled.
        public let enabled: Bool?
        /// The date and time, in ISO-8601 Extended format, for when the maintenance window is scheduled to become inactive. The maintenance window won't run after this specified time.
        public let endDate: String?
        /// The date the maintenance window was last modified.
        public let modifiedDate: Date?
        /// The name of the maintenance window.
        public let name: String?
        /// The next time the maintenance window will actually run, taking into account any specified times for the maintenance window to become active or inactive.
        public let nextExecutionTime: String?
        /// The schedule of the maintenance window in the form of a cron or rate expression.
        public let schedule: String?
        /// The number of days to wait to run a maintenance window after the scheduled cron expression date and time.
        public let scheduleOffset: Int?
        /// The time zone that the scheduled maintenance window executions are based on, in Internet Assigned Numbers Authority (IANA) format. For example: "America/Los_Angeles", "UTC", or "Asia/Seoul". For more information, see the Time Zone Database on the IANA website.
        public let scheduleTimezone: String?
        /// The date and time, in ISO-8601 Extended format, for when the maintenance window is scheduled to become active. The maintenance window won't run before this specified time.
        public let startDate: String?
        /// The ID of the created maintenance window.
        public let windowId: String?

        @inlinable
        public init(allowUnassociatedTargets: Bool? = nil, createdDate: Date? = nil, cutoff: Int? = nil, description: String? = nil, duration: Int? = nil, enabled: Bool? = nil, endDate: String? = nil, modifiedDate: Date? = nil, name: String? = nil, nextExecutionTime: String? = nil, schedule: String? = nil, scheduleOffset: Int? = nil, scheduleTimezone: String? = nil, startDate: String? = nil, windowId: String? = nil) {
            self.allowUnassociatedTargets = allowUnassociatedTargets
            self.createdDate = createdDate
            self.cutoff = cutoff
            self.description = description
            self.duration = duration
            self.enabled = enabled
            self.endDate = endDate
            self.modifiedDate = modifiedDate
            self.name = name
            self.nextExecutionTime = nextExecutionTime
            self.schedule = schedule
            self.scheduleOffset = scheduleOffset
            self.scheduleTimezone = scheduleTimezone
            self.startDate = startDate
            self.windowId = windowId
        }

        private enum CodingKeys: String, CodingKey {
            case allowUnassociatedTargets = "AllowUnassociatedTargets"
            case createdDate = "CreatedDate"
            case cutoff = "Cutoff"
            case description = "Description"
            case duration = "Duration"
            case enabled = "Enabled"
            case endDate = "EndDate"
            case modifiedDate = "ModifiedDate"
            case name = "Name"
            case nextExecutionTime = "NextExecutionTime"
            case schedule = "Schedule"
            case scheduleOffset = "ScheduleOffset"
            case scheduleTimezone = "ScheduleTimezone"
            case startDate = "StartDate"
            case windowId = "WindowId"
        }
    }

    public struct GetMaintenanceWindowTaskRequest: AWSEncodableShape {
        /// The maintenance window ID that includes the task to retrieve.
        public let windowId: String
        /// The maintenance window task ID to retrieve.
        public let windowTaskId: String

        @inlinable
        public init(windowId: String, windowTaskId: String) {
            self.windowId = windowId
            self.windowTaskId = windowTaskId
        }

        public func validate(name: String) throws {
            try self.validate(self.windowId, name: "windowId", parent: name, max: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, min: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, pattern: "^mw-[0-9a-f]{17}$")
            try self.validate(self.windowTaskId, name: "windowTaskId", parent: name, max: 36)
            try self.validate(self.windowTaskId, name: "windowTaskId", parent: name, min: 36)
            try self.validate(self.windowTaskId, name: "windowTaskId", parent: name, pattern: "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case windowId = "WindowId"
            case windowTaskId = "WindowTaskId"
        }
    }

    public struct GetMaintenanceWindowTaskResult: AWSDecodableShape {
        /// The details for the CloudWatch alarm you applied to your maintenance window task.
        public let alarmConfiguration: AlarmConfiguration?
        /// The action to take on tasks when the maintenance window cutoff time is reached. CONTINUE_TASK means that tasks continue to run. For Automation, Lambda, Step Functions tasks, CANCEL_TASK means that currently running task invocations continue, but no new task invocations are started. For Run Command tasks, CANCEL_TASK means the system attempts to stop the task by sending a CancelCommand operation.
        public let cutoffBehavior: MaintenanceWindowTaskCutoffBehavior?
        /// The retrieved task description.
        public let description: String?
        /// The location in Amazon Simple Storage Service (Amazon S3) where the task results are logged.   LoggingInfo has been deprecated. To specify an Amazon Simple Storage Service (Amazon S3) bucket to contain logs, instead use the OutputS3BucketName and OutputS3KeyPrefix options in the TaskInvocationParameters structure. For information about how Amazon Web Services Systems Manager handles these options for the supported maintenance window task types, see MaintenanceWindowTaskInvocationParameters.
        public let loggingInfo: LoggingInfo?
        /// The maximum number of targets allowed to run this task in parallel.  For maintenance window tasks without a target specified, you can't supply a value for this option. Instead, the system inserts a placeholder value of 1, which may be reported in the response to this command. This value doesn't affect the running of your task and can be ignored.
        public let maxConcurrency: String?
        /// The maximum number of errors allowed before the task stops being scheduled.  For maintenance window tasks without a target specified, you can't supply a value for this option. Instead, the system inserts a placeholder value of 1, which may be reported in the response to this command. This value doesn't affect the running of your task and can be ignored.
        public let maxErrors: String?
        /// The retrieved task name.
        public let name: String?
        /// The priority of the task when it runs. The lower the number, the higher the priority. Tasks that have the same priority are scheduled in parallel.
        public let priority: Int?
        /// The Amazon Resource Name (ARN) of the IAM service role for Amazon Web Services Systems Manager to assume when running a maintenance window task. If you do not specify a service role ARN, Systems Manager uses a service-linked role in your account. If no appropriate service-linked role for Systems Manager exists in your account, it is created when you run RegisterTaskWithMaintenanceWindow. However, for an improved security posture, we strongly recommend creating a custom policy and custom service role for running your maintenance window tasks. The policy can be crafted to provide only the permissions needed for your particular maintenance window tasks. For more information, see Setting up Maintenance Windows in the in the Amazon Web Services Systems Manager User Guide.
        public let serviceRoleArn: String?
        /// The targets where the task should run.
        public let targets: [Target]?
        /// The resource that the task used during execution. For RUN_COMMAND and AUTOMATION task types, the value of TaskArn is the SSM document name/ARN. For LAMBDA tasks, the value is the function name/ARN. For STEP_FUNCTIONS tasks, the value is the state machine ARN.
        public let taskArn: String?
        /// The parameters to pass to the task when it runs.
        public let taskInvocationParameters: MaintenanceWindowTaskInvocationParameters?
        /// The parameters to pass to the task when it runs.   TaskParameters has been deprecated. To specify parameters to pass to a task when it runs, instead use the Parameters option in the TaskInvocationParameters structure. For information about how Systems Manager handles these options for the supported maintenance window task types, see MaintenanceWindowTaskInvocationParameters.
        public let taskParameters: [String: MaintenanceWindowTaskParameterValueExpression]?
        /// The type of task to run.
        public let taskType: MaintenanceWindowTaskType?
        /// The retrieved maintenance window ID.
        public let windowId: String?
        /// The retrieved maintenance window task ID.
        public let windowTaskId: String?

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, cutoffBehavior: MaintenanceWindowTaskCutoffBehavior? = nil, description: String? = nil, loggingInfo: LoggingInfo? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, name: String? = nil, priority: Int? = nil, serviceRoleArn: String? = nil, targets: [Target]? = nil, taskArn: String? = nil, taskInvocationParameters: MaintenanceWindowTaskInvocationParameters? = nil, taskParameters: [String: MaintenanceWindowTaskParameterValueExpression]? = nil, taskType: MaintenanceWindowTaskType? = nil, windowId: String? = nil, windowTaskId: String? = nil) {
            self.alarmConfiguration = alarmConfiguration
            self.cutoffBehavior = cutoffBehavior
            self.description = description
            self.loggingInfo = loggingInfo
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.name = name
            self.priority = priority
            self.serviceRoleArn = serviceRoleArn
            self.targets = targets
            self.taskArn = taskArn
            self.taskInvocationParameters = taskInvocationParameters
            self.taskParameters = taskParameters
            self.taskType = taskType
            self.windowId = windowId
            self.windowTaskId = windowTaskId
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case cutoffBehavior = "CutoffBehavior"
            case description = "Description"
            case loggingInfo = "LoggingInfo"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case name = "Name"
            case priority = "Priority"
            case serviceRoleArn = "ServiceRoleArn"
            case targets = "Targets"
            case taskArn = "TaskArn"
            case taskInvocationParameters = "TaskInvocationParameters"
            case taskParameters = "TaskParameters"
            case taskType = "TaskType"
            case windowId = "WindowId"
            case windowTaskId = "WindowTaskId"
        }
    }

    public struct GetOpsItemRequest: AWSEncodableShape {
        /// The OpsItem Amazon Resource Name (ARN).
        public let opsItemArn: String?
        /// The ID of the OpsItem that you want to get.
        public let opsItemId: String

        @inlinable
        public init(opsItemArn: String? = nil, opsItemId: String) {
            self.opsItemArn = opsItemArn
            self.opsItemId = opsItemId
        }

        public func validate(name: String) throws {
            try self.validate(self.opsItemArn, name: "opsItemArn", parent: name, max: 2048)
            try self.validate(self.opsItemArn, name: "opsItemArn", parent: name, min: 20)
            try self.validate(self.opsItemArn, name: "opsItemArn", parent: name, pattern: "^arn:(aws[a-zA-Z-]*)?:ssm:[a-z0-9-\\.]{0,63}:[0-9]{12}:opsitem")
            try self.validate(self.opsItemId, name: "opsItemId", parent: name, pattern: "^(oi)-[0-9a-f]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case opsItemArn = "OpsItemArn"
            case opsItemId = "OpsItemId"
        }
    }

    public struct GetOpsItemResponse: AWSDecodableShape {
        /// The OpsItem.
        public let opsItem: OpsItem?

        @inlinable
        public init(opsItem: OpsItem? = nil) {
            self.opsItem = opsItem
        }

        private enum CodingKeys: String, CodingKey {
            case opsItem = "OpsItem"
        }
    }

    public struct GetOpsMetadataRequest: AWSEncodableShape {
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?
        /// The Amazon Resource Name (ARN) of an OpsMetadata Object to view.
        public let opsMetadataArn: String

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil, opsMetadataArn: String) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.opsMetadataArn = opsMetadataArn
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 10)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.opsMetadataArn, name: "opsMetadataArn", parent: name, max: 1011)
            try self.validate(self.opsMetadataArn, name: "opsMetadataArn", parent: name, min: 1)
            try self.validate(self.opsMetadataArn, name: "opsMetadataArn", parent: name, pattern: "^arn:(aws[a-zA-Z-]*)?:ssm:[a-z0-9-\\.]{0,63}:[a-z0-9-\\.]{0,63}:opsmetadata\\/([a-zA-Z0-9-_\\.\\/]*)$")
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case opsMetadataArn = "OpsMetadataArn"
        }
    }

    public struct GetOpsMetadataResult: AWSDecodableShape {
        /// OpsMetadata for an Application Manager application.
        public let metadata: [String: MetadataValue]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?
        /// The resource ID of the Application Manager application.
        public let resourceId: String?

        @inlinable
        public init(metadata: [String: MetadataValue]? = nil, nextToken: String? = nil, resourceId: String? = nil) {
            self.metadata = metadata
            self.nextToken = nextToken
            self.resourceId = resourceId
        }

        private enum CodingKeys: String, CodingKey {
            case metadata = "Metadata"
            case nextToken = "NextToken"
            case resourceId = "ResourceId"
        }
    }

    public struct GetOpsSummaryRequest: AWSEncodableShape {
        /// Optional aggregators that return counts of OpsData based on one or more expressions.
        public let aggregators: [OpsAggregator]?
        /// Optional filters used to scope down the returned OpsData.
        public let filters: [OpsFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?
        /// The OpsData data type to return.
        public let resultAttributes: [OpsResultAttribute]?
        /// Specify the name of a resource data sync to get.
        public let syncName: String?

        @inlinable
        public init(aggregators: [OpsAggregator]? = nil, filters: [OpsFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, resultAttributes: [OpsResultAttribute]? = nil, syncName: String? = nil) {
            self.aggregators = aggregators
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.resultAttributes = resultAttributes
            self.syncName = syncName
        }

        public func validate(name: String) throws {
            try self.aggregators?.forEach {
                try $0.validate(name: "\(name).aggregators[]")
            }
            try self.validate(self.aggregators, name: "aggregators", parent: name, max: 12)
            try self.validate(self.aggregators, name: "aggregators", parent: name, min: 1)
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.filters, name: "filters", parent: name, min: 1)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.resultAttributes?.forEach {
                try $0.validate(name: "\(name).resultAttributes[]")
            }
            try self.validate(self.resultAttributes, name: "resultAttributes", parent: name, min: 1)
            try self.validate(self.syncName, name: "syncName", parent: name, max: 64)
            try self.validate(self.syncName, name: "syncName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case aggregators = "Aggregators"
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case resultAttributes = "ResultAttributes"
            case syncName = "SyncName"
        }
    }

    public struct GetOpsSummaryResult: AWSDecodableShape {
        /// The list of aggregated details and filtered OpsData.
        public let entities: [OpsEntity]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(entities: [OpsEntity]? = nil, nextToken: String? = nil) {
            self.entities = entities
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case entities = "Entities"
            case nextToken = "NextToken"
        }
    }

    public struct GetParameterHistoryRequest: AWSEncodableShape {
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The name or Amazon Resource Name (ARN) of the parameter for which you want to review history. For parameters shared with you from another account, you must use the full ARN.
        public let name: String
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// Return decrypted values for secure string parameters. This flag is ignored for String and StringList parameter types.
        public let withDecryption: Bool?

        @inlinable
        public init(maxResults: Int? = nil, name: String, nextToken: String? = nil, withDecryption: Bool? = nil) {
            self.maxResults = maxResults
            self.name = name
            self.nextToken = nextToken
            self.withDecryption = withDecryption
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 2048)
            try self.validate(self.name, name: "name", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case name = "Name"
            case nextToken = "NextToken"
            case withDecryption = "WithDecryption"
        }
    }

    public struct GetParameterHistoryResult: AWSDecodableShape {
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?
        /// A list of parameters returned by the request.
        public let parameters: [ParameterHistory]?

        @inlinable
        public init(nextToken: String? = nil, parameters: [ParameterHistory]? = nil) {
            self.nextToken = nextToken
            self.parameters = parameters
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case parameters = "Parameters"
        }
    }

    public struct GetParameterRequest: AWSEncodableShape {
        /// The name or Amazon Resource Name (ARN) of the parameter that you want to query. For parameters shared with you from another account, you must use the full ARN. To query by parameter label, use "Name": "name:label". To query by parameter version, use "Name": "name:version". For more information about shared parameters, see Working with shared parameters in the Amazon Web Services Systems Manager User Guide.
        public let name: String
        /// Return decrypted values for secure string parameters. This flag is ignored for String and StringList parameter types.
        public let withDecryption: Bool?

        @inlinable
        public init(name: String, withDecryption: Bool? = nil) {
            self.name = name
            self.withDecryption = withDecryption
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 2048)
            try self.validate(self.name, name: "name", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case withDecryption = "WithDecryption"
        }
    }

    public struct GetParameterResult: AWSDecodableShape {
        /// Information about a parameter.
        public let parameter: Parameter?

        @inlinable
        public init(parameter: Parameter? = nil) {
            self.parameter = parameter
        }

        private enum CodingKeys: String, CodingKey {
            case parameter = "Parameter"
        }
    }

    public struct GetParametersByPathRequest: AWSEncodableShape {
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?
        /// Filters to limit the request results.  The following Key values are supported for GetParametersByPath: Type, KeyId, and Label. The following Key values aren't supported for GetParametersByPath: tag, DataType, Name, Path, and Tier.
        public let parameterFilters: [ParameterStringFilter]?
        /// The hierarchy for the parameter. Hierarchies start with a forward slash (/). The hierarchy is the parameter name except the last part of the parameter. For the API call to succeed, the last part of the parameter name can't be in the path. A parameter name hierarchy can have a maximum of 15 levels. Here is an example of a hierarchy: /Finance/Prod/IAD/WinServ2016/license33
        public let path: String
        /// Retrieve all parameters within a hierarchy.  If a user has access to a path, then the user can access all levels of that path. For example, if a user has permission to access path /a, then the user can also access /a/b. Even if a user has explicitly been denied access in IAM for parameter /a/b, they can still call the GetParametersByPath API operation recursively for /a and view /a/b.
        public let recursive: Bool?
        /// Retrieve all parameters in a hierarchy with their value decrypted.
        public let withDecryption: Bool?

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil, parameterFilters: [ParameterStringFilter]? = nil, path: String, recursive: Bool? = nil, withDecryption: Bool? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.parameterFilters = parameterFilters
            self.path = path
            self.recursive = recursive
            self.withDecryption = withDecryption
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 10)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.parameterFilters?.forEach {
                try $0.validate(name: "\(name).parameterFilters[]")
            }
            try self.validate(self.path, name: "path", parent: name, max: 2048)
            try self.validate(self.path, name: "path", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case parameterFilters = "ParameterFilters"
            case path = "Path"
            case recursive = "Recursive"
            case withDecryption = "WithDecryption"
        }
    }

    public struct GetParametersByPathResult: AWSDecodableShape {
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?
        /// A list of parameters found in the specified hierarchy.
        public let parameters: [Parameter]?

        @inlinable
        public init(nextToken: String? = nil, parameters: [Parameter]? = nil) {
            self.nextToken = nextToken
            self.parameters = parameters
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case parameters = "Parameters"
        }
    }

    public struct GetParametersRequest: AWSEncodableShape {
        /// The names or Amazon Resource Names (ARNs) of the parameters that you want to query. For parameters shared with you from another account, you must use the full ARNs. To query by parameter label, use "Name": "name:label". To query by parameter version, use "Name": "name:version".  The results for GetParameters requests are listed in alphabetical order in query responses.  For information about shared parameters, see Working with shared parameters in the Amazon Web Services Systems Manager User Guide.
        public let names: [String]
        /// Return decrypted secure string value. Return decrypted values for secure string parameters. This flag is ignored for String and StringList parameter types.
        public let withDecryption: Bool?

        @inlinable
        public init(names: [String], withDecryption: Bool? = nil) {
            self.names = names
            self.withDecryption = withDecryption
        }

        public func validate(name: String) throws {
            try self.names.forEach {
                try validate($0, name: "names[]", parent: name, max: 2048)
                try validate($0, name: "names[]", parent: name, min: 1)
            }
            try self.validate(self.names, name: "names", parent: name, max: 10)
            try self.validate(self.names, name: "names", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case names = "Names"
            case withDecryption = "WithDecryption"
        }
    }

    public struct GetParametersResult: AWSDecodableShape {
        /// A list of parameters that aren't formatted correctly or don't run during an execution.
        public let invalidParameters: [String]?
        /// A list of details for a parameter.
        public let parameters: [Parameter]?

        @inlinable
        public init(invalidParameters: [String]? = nil, parameters: [Parameter]? = nil) {
            self.invalidParameters = invalidParameters
            self.parameters = parameters
        }

        private enum CodingKeys: String, CodingKey {
            case invalidParameters = "InvalidParameters"
            case parameters = "Parameters"
        }
    }

    public struct GetPatchBaselineForPatchGroupRequest: AWSEncodableShape {
        /// Returns the operating system rule specified for patch groups using the patch baseline.
        public let operatingSystem: OperatingSystem?
        /// The name of the patch group whose patch baseline should be retrieved.
        public let patchGroup: String

        @inlinable
        public init(operatingSystem: OperatingSystem? = nil, patchGroup: String) {
            self.operatingSystem = operatingSystem
            self.patchGroup = patchGroup
        }

        public func validate(name: String) throws {
            try self.validate(self.patchGroup, name: "patchGroup", parent: name, max: 256)
            try self.validate(self.patchGroup, name: "patchGroup", parent: name, min: 1)
            try self.validate(self.patchGroup, name: "patchGroup", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
        }

        private enum CodingKeys: String, CodingKey {
            case operatingSystem = "OperatingSystem"
            case patchGroup = "PatchGroup"
        }
    }

    public struct GetPatchBaselineForPatchGroupResult: AWSDecodableShape {
        /// The ID of the patch baseline that should be used for the patch group.
        public let baselineId: String?
        /// The operating system rule specified for patch groups using the patch baseline.
        public let operatingSystem: OperatingSystem?
        /// The name of the patch group.
        public let patchGroup: String?

        @inlinable
        public init(baselineId: String? = nil, operatingSystem: OperatingSystem? = nil, patchGroup: String? = nil) {
            self.baselineId = baselineId
            self.operatingSystem = operatingSystem
            self.patchGroup = patchGroup
        }

        private enum CodingKeys: String, CodingKey {
            case baselineId = "BaselineId"
            case operatingSystem = "OperatingSystem"
            case patchGroup = "PatchGroup"
        }
    }

    public struct GetPatchBaselineRequest: AWSEncodableShape {
        /// The ID of the patch baseline to retrieve.  To retrieve information about an Amazon Web Services managed patch baseline, specify the full Amazon Resource Name (ARN) of the baseline. For example, for the baseline AWS-AmazonLinuxDefaultPatchBaseline, specify arn:aws:ssm:us-east-2:733109147000:patchbaseline/pb-0e392de35e7c563b7 instead of pb-0e392de35e7c563b7.
        public let baselineId: String

        @inlinable
        public init(baselineId: String) {
            self.baselineId = baselineId
        }

        public func validate(name: String) throws {
            try self.validate(self.baselineId, name: "baselineId", parent: name, max: 128)
            try self.validate(self.baselineId, name: "baselineId", parent: name, min: 20)
            try self.validate(self.baselineId, name: "baselineId", parent: name, pattern: "^[a-zA-Z0-9_\\-:/]{20,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case baselineId = "BaselineId"
        }
    }

    public struct GetPatchBaselineResult: AWSDecodableShape {
        /// A set of rules used to include patches in the baseline.
        public let approvalRules: PatchRuleGroup?
        /// A list of explicitly approved patches for the baseline.
        public let approvedPatches: [String]?
        /// Returns the specified compliance severity level for approved patches in the patch baseline.
        public let approvedPatchesComplianceLevel: PatchComplianceLevel?
        /// Indicates whether the list of approved patches includes non-security updates that should be applied to the managed nodes. The default value is false. Applies to Linux managed nodes only.
        public let approvedPatchesEnableNonSecurity: Bool?
        /// Indicates the compliance status of managed nodes for which security-related patches are available but were not approved. This preference is specified when the CreatePatchBaseline or UpdatePatchBaseline commands are run. Applies to Windows Server managed nodes only.
        public let availableSecurityUpdatesComplianceStatus: PatchComplianceStatus?
        /// The ID of the retrieved patch baseline.
        public let baselineId: String?
        /// The date the patch baseline was created.
        public let createdDate: Date?
        /// A description of the patch baseline.
        public let description: String?
        /// A set of global filters used to exclude patches from the baseline.
        public let globalFilters: PatchFilterGroup?
        /// The date the patch baseline was last modified.
        public let modifiedDate: Date?
        /// The name of the patch baseline.
        public let name: String?
        /// Returns the operating system specified for the patch baseline.
        public let operatingSystem: OperatingSystem?
        /// Patch groups included in the patch baseline.
        public let patchGroups: [String]?
        /// A list of explicitly rejected patches for the baseline.
        public let rejectedPatches: [String]?
        /// The action specified to take on patches included in the RejectedPatches list. A patch can be allowed only if it is a dependency of another package, or blocked entirely along with packages that include it as a dependency.
        public let rejectedPatchesAction: PatchAction?
        /// Information about the patches to use to update the managed nodes, including target operating systems and source repositories. Applies to Linux managed nodes only.
        public let sources: [PatchSource]?

        @inlinable
        public init(approvalRules: PatchRuleGroup? = nil, approvedPatches: [String]? = nil, approvedPatchesComplianceLevel: PatchComplianceLevel? = nil, approvedPatchesEnableNonSecurity: Bool? = nil, availableSecurityUpdatesComplianceStatus: PatchComplianceStatus? = nil, baselineId: String? = nil, createdDate: Date? = nil, description: String? = nil, globalFilters: PatchFilterGroup? = nil, modifiedDate: Date? = nil, name: String? = nil, operatingSystem: OperatingSystem? = nil, patchGroups: [String]? = nil, rejectedPatches: [String]? = nil, rejectedPatchesAction: PatchAction? = nil, sources: [PatchSource]? = nil) {
            self.approvalRules = approvalRules
            self.approvedPatches = approvedPatches
            self.approvedPatchesComplianceLevel = approvedPatchesComplianceLevel
            self.approvedPatchesEnableNonSecurity = approvedPatchesEnableNonSecurity
            self.availableSecurityUpdatesComplianceStatus = availableSecurityUpdatesComplianceStatus
            self.baselineId = baselineId
            self.createdDate = createdDate
            self.description = description
            self.globalFilters = globalFilters
            self.modifiedDate = modifiedDate
            self.name = name
            self.operatingSystem = operatingSystem
            self.patchGroups = patchGroups
            self.rejectedPatches = rejectedPatches
            self.rejectedPatchesAction = rejectedPatchesAction
            self.sources = sources
        }

        private enum CodingKeys: String, CodingKey {
            case approvalRules = "ApprovalRules"
            case approvedPatches = "ApprovedPatches"
            case approvedPatchesComplianceLevel = "ApprovedPatchesComplianceLevel"
            case approvedPatchesEnableNonSecurity = "ApprovedPatchesEnableNonSecurity"
            case availableSecurityUpdatesComplianceStatus = "AvailableSecurityUpdatesComplianceStatus"
            case baselineId = "BaselineId"
            case createdDate = "CreatedDate"
            case description = "Description"
            case globalFilters = "GlobalFilters"
            case modifiedDate = "ModifiedDate"
            case name = "Name"
            case operatingSystem = "OperatingSystem"
            case patchGroups = "PatchGroups"
            case rejectedPatches = "RejectedPatches"
            case rejectedPatchesAction = "RejectedPatchesAction"
            case sources = "Sources"
        }
    }

    public struct GetResourcePoliciesRequest: AWSEncodableShape {
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?
        /// Amazon Resource Name (ARN) of the resource to which the policies are attached.
        public let resourceArn: String

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil, resourceArn: String) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.resourceArn = resourceArn
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, max: 2048)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, min: 20)
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case resourceArn = "ResourceArn"
        }
    }

    public struct GetResourcePoliciesResponse: AWSDecodableShape {
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?
        /// An array of the Policy object.
        public let policies: [GetResourcePoliciesResponseEntry]?

        @inlinable
        public init(nextToken: String? = nil, policies: [GetResourcePoliciesResponseEntry]? = nil) {
            self.nextToken = nextToken
            self.policies = policies
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case policies = "Policies"
        }
    }

    public struct GetResourcePoliciesResponseEntry: AWSDecodableShape {
        /// A resource policy helps you to define the IAM entity (for example, an Amazon Web Services account) that can manage your Systems Manager resources. Currently, OpsItemGroup is the only resource that supports Systems Manager resource policies. The resource policy for OpsItemGroup enables Amazon Web Services accounts to view and interact with OpsCenter operational work items (OpsItems).
        public let policy: String?
        /// ID of the current policy version. The hash helps to prevent a situation where multiple users attempt to overwrite a policy. You must provide this hash when updating or deleting a policy.
        public let policyHash: String?
        /// A policy ID.
        public let policyId: String?

        @inlinable
        public init(policy: String? = nil, policyHash: String? = nil, policyId: String? = nil) {
            self.policy = policy
            self.policyHash = policyHash
            self.policyId = policyId
        }

        private enum CodingKeys: String, CodingKey {
            case policy = "Policy"
            case policyHash = "PolicyHash"
            case policyId = "PolicyId"
        }
    }

    public struct GetServiceSettingRequest: AWSEncodableShape {
        /// The ID of the service setting to get. The setting ID can be one of the following.    /ssm/appmanager/appmanager-enabled     /ssm/automation/customer-script-log-destination     /ssm/automation/customer-script-log-group-name    /ssm/automation/enable-adaptive-concurrency    /ssm/documents/console/public-sharing-permission     /ssm/managed-instance/activation-tier     /ssm/managed-instance/default-ec2-instance-management-role     /ssm/opsinsights/opscenter     /ssm/parameter-store/default-parameter-tier     /ssm/parameter-store/high-throughput-enabled
        public let settingId: String

        @inlinable
        public init(settingId: String) {
            self.settingId = settingId
        }

        public func validate(name: String) throws {
            try self.validate(self.settingId, name: "settingId", parent: name, max: 1000)
            try self.validate(self.settingId, name: "settingId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case settingId = "SettingId"
        }
    }

    public struct GetServiceSettingResult: AWSDecodableShape {
        /// The query result of the current service setting.
        public let serviceSetting: ServiceSetting?

        @inlinable
        public init(serviceSetting: ServiceSetting? = nil) {
            self.serviceSetting = serviceSetting
        }

        private enum CodingKeys: String, CodingKey {
            case serviceSetting = "ServiceSetting"
        }
    }

    public struct InstanceAggregatedAssociationOverview: AWSDecodableShape {
        /// Detailed status information about the aggregated associations.
        public let detailedStatus: String?
        /// The number of associations for the managed nodes.
        public let instanceAssociationStatusAggregatedCount: [String: Int]?

        @inlinable
        public init(detailedStatus: String? = nil, instanceAssociationStatusAggregatedCount: [String: Int]? = nil) {
            self.detailedStatus = detailedStatus
            self.instanceAssociationStatusAggregatedCount = instanceAssociationStatusAggregatedCount
        }

        private enum CodingKeys: String, CodingKey {
            case detailedStatus = "DetailedStatus"
            case instanceAssociationStatusAggregatedCount = "InstanceAssociationStatusAggregatedCount"
        }
    }

    public struct InstanceAssociation: AWSDecodableShape {
        /// The association ID.
        public let associationId: String?
        /// Version information for the association on the managed node.
        public let associationVersion: String?
        /// The content of the association document for the managed nodes.
        public let content: String?
        /// The managed node ID.
        public let instanceId: String?

        @inlinable
        public init(associationId: String? = nil, associationVersion: String? = nil, content: String? = nil, instanceId: String? = nil) {
            self.associationId = associationId
            self.associationVersion = associationVersion
            self.content = content
            self.instanceId = instanceId
        }

        private enum CodingKeys: String, CodingKey {
            case associationId = "AssociationId"
            case associationVersion = "AssociationVersion"
            case content = "Content"
            case instanceId = "InstanceId"
        }
    }

    public struct InstanceAssociationOutputLocation: AWSEncodableShape & AWSDecodableShape {
        /// An S3 bucket where you want to store the results of this request.
        public let s3Location: S3OutputLocation?

        @inlinable
        public init(s3Location: S3OutputLocation? = nil) {
            self.s3Location = s3Location
        }

        public func validate(name: String) throws {
            try self.s3Location?.validate(name: "\(name).s3Location")
        }

        private enum CodingKeys: String, CodingKey {
            case s3Location = "S3Location"
        }
    }

    public struct InstanceAssociationOutputUrl: AWSDecodableShape {
        /// The URL of S3 bucket where you want to store the results of this request.
        public let s3OutputUrl: S3OutputUrl?

        @inlinable
        public init(s3OutputUrl: S3OutputUrl? = nil) {
            self.s3OutputUrl = s3OutputUrl
        }

        private enum CodingKeys: String, CodingKey {
            case s3OutputUrl = "S3OutputUrl"
        }
    }

    public struct InstanceAssociationStatusInfo: AWSDecodableShape {
        /// The association ID.
        public let associationId: String?
        /// The name of the association applied to the managed node.
        public let associationName: String?
        /// The version of the association applied to the managed node.
        public let associationVersion: String?
        /// Detailed status information about the association.
        public let detailedStatus: String?
        /// The association document versions.
        public let documentVersion: String?
        /// An error code returned by the request to create the association.
        public let errorCode: String?
        /// The date the association ran.
        public let executionDate: Date?
        /// Summary information about association execution.
        public let executionSummary: String?
        /// The managed node ID where the association was created.
        public let instanceId: String?
        /// The name of the association.
        public let name: String?
        /// A URL for an S3 bucket where you want to store the results of this request.
        public let outputUrl: InstanceAssociationOutputUrl?
        /// Status information about the association.
        public let status: String?

        @inlinable
        public init(associationId: String? = nil, associationName: String? = nil, associationVersion: String? = nil, detailedStatus: String? = nil, documentVersion: String? = nil, errorCode: String? = nil, executionDate: Date? = nil, executionSummary: String? = nil, instanceId: String? = nil, name: String? = nil, outputUrl: InstanceAssociationOutputUrl? = nil, status: String? = nil) {
            self.associationId = associationId
            self.associationName = associationName
            self.associationVersion = associationVersion
            self.detailedStatus = detailedStatus
            self.documentVersion = documentVersion
            self.errorCode = errorCode
            self.executionDate = executionDate
            self.executionSummary = executionSummary
            self.instanceId = instanceId
            self.name = name
            self.outputUrl = outputUrl
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case associationId = "AssociationId"
            case associationName = "AssociationName"
            case associationVersion = "AssociationVersion"
            case detailedStatus = "DetailedStatus"
            case documentVersion = "DocumentVersion"
            case errorCode = "ErrorCode"
            case executionDate = "ExecutionDate"
            case executionSummary = "ExecutionSummary"
            case instanceId = "InstanceId"
            case name = "Name"
            case outputUrl = "OutputUrl"
            case status = "Status"
        }
    }

    public struct InstanceInfo: AWSDecodableShape {
        /// The type of agent installed on the node.
        public let agentType: String?
        /// The version number of the agent installed on the node.
        public let agentVersion: String?
        /// The fully qualified host name of the managed node.
        public let computerName: String?
        /// The current status of the managed node.
        public let instanceStatus: String?
        /// The IP address of the managed node.
        public let ipAddress: String?
        /// Indicates whether the node is managed by Systems Manager.
        public let managedStatus: ManagedStatus?
        /// The name of the operating system platform running on your managed node.
        public let platformName: String?
        /// The operating system platform type of the managed node.
        public let platformType: PlatformType?
        /// The version of the OS platform running on your managed node.
        public let platformVersion: String?
        /// The type of instance, either an EC2 instance or another supported machine type in a hybrid fleet.
        public let resourceType: ResourceType?

        @inlinable
        public init(agentType: String? = nil, agentVersion: String? = nil, computerName: String? = nil, instanceStatus: String? = nil, ipAddress: String? = nil, managedStatus: ManagedStatus? = nil, platformName: String? = nil, platformType: PlatformType? = nil, platformVersion: String? = nil, resourceType: ResourceType? = nil) {
            self.agentType = agentType
            self.agentVersion = agentVersion
            self.computerName = computerName
            self.instanceStatus = instanceStatus
            self.ipAddress = ipAddress
            self.managedStatus = managedStatus
            self.platformName = platformName
            self.platformType = platformType
            self.platformVersion = platformVersion
            self.resourceType = resourceType
        }

        private enum CodingKeys: String, CodingKey {
            case agentType = "AgentType"
            case agentVersion = "AgentVersion"
            case computerName = "ComputerName"
            case instanceStatus = "InstanceStatus"
            case ipAddress = "IpAddress"
            case managedStatus = "ManagedStatus"
            case platformName = "PlatformName"
            case platformType = "PlatformType"
            case platformVersion = "PlatformVersion"
            case resourceType = "ResourceType"
        }
    }

    public struct InstanceInformation: AWSDecodableShape {
        /// The activation ID created by Amazon Web Services Systems Manager when the server or virtual machine (VM) was registered.
        public let activationId: String?
        /// The version of SSM Agent running on your Linux managed node.
        public let agentVersion: String?
        /// Information about the association.
        public let associationOverview: InstanceAggregatedAssociationOverview?
        /// The status of the association.
        public let associationStatus: String?
        /// The fully qualified host name of the managed node.
        public let computerName: String?
        /// The role assigned to an Amazon EC2 instance configured with a Systems Manager Quick Setup host management configuration or the role assigned to an on-premises managed node. This call doesn't return the IAM role for unmanaged Amazon EC2 instances (instances not configured for Systems Manager). To retrieve the role for an unmanaged instance, use the Amazon EC2 DescribeInstances operation. For information, see DescribeInstances in the Amazon EC2 API Reference or describe-instances in the Amazon Web Services CLI Command Reference.
        public let iamRole: String?
        /// The managed node ID.
        public let instanceId: String?
        /// The IP address of the managed node.
        public let ipAddress: String?
        /// Indicates whether the latest version of SSM Agent is running on your Linux managed node. This field doesn't indicate whether or not the latest version is installed on Windows managed nodes, because some older versions of Windows Server use the EC2Config service to process Systems Manager requests.
        public let isLatestVersion: Bool?
        /// The date the association was last run.
        public let lastAssociationExecutionDate: Date?
        /// The date and time when the agent last pinged the Systems Manager service.
        public let lastPingDateTime: Date?
        /// The last date the association was successfully run.
        public let lastSuccessfulAssociationExecutionDate: Date?
        /// The name assigned to an on-premises server, edge device, or virtual machine (VM) when it is activated as a Systems Manager managed node. The name is specified as the DefaultInstanceName property using the CreateActivation command. It is applied to the managed node by specifying the Activation Code and Activation ID when you install SSM Agent on the node, as explained in How to install SSM Agent on hybrid Linux nodes and How to install SSM Agent on hybrid Windows Server nodes. To retrieve the Name tag of an EC2 instance, use the Amazon EC2 DescribeInstances operation. For information, see DescribeInstances in the Amazon EC2 API Reference or describe-instances in the Amazon Web Services CLI Command Reference.
        public let name: String?
        /// Connection status of SSM Agent.   The status Inactive has been deprecated and is no longer in use.
        public let pingStatus: PingStatus?
        /// The name of the operating system platform running on your managed node.
        public let platformName: String?
        /// The operating system platform type.
        public let platformType: PlatformType?
        /// The version of the OS platform running on your managed node.
        public let platformVersion: String?
        /// The date the server or VM was registered with Amazon Web Services as a managed node.
        public let registrationDate: Date?
        /// The type of instance. Instances are either EC2 instances or managed instances.
        public let resourceType: ResourceType?
        /// The ID of the source resource. For IoT Greengrass devices, SourceId is the Thing name.
        public let sourceId: String?
        /// The type of the source resource. For IoT Greengrass devices, SourceType is AWS::IoT::Thing.
        public let sourceType: SourceType?

        @inlinable
        public init(activationId: String? = nil, agentVersion: String? = nil, associationOverview: InstanceAggregatedAssociationOverview? = nil, associationStatus: String? = nil, computerName: String? = nil, iamRole: String? = nil, instanceId: String? = nil, ipAddress: String? = nil, isLatestVersion: Bool? = nil, lastAssociationExecutionDate: Date? = nil, lastPingDateTime: Date? = nil, lastSuccessfulAssociationExecutionDate: Date? = nil, name: String? = nil, pingStatus: PingStatus? = nil, platformName: String? = nil, platformType: PlatformType? = nil, platformVersion: String? = nil, registrationDate: Date? = nil, resourceType: ResourceType? = nil, sourceId: String? = nil, sourceType: SourceType? = nil) {
            self.activationId = activationId
            self.agentVersion = agentVersion
            self.associationOverview = associationOverview
            self.associationStatus = associationStatus
            self.computerName = computerName
            self.iamRole = iamRole
            self.instanceId = instanceId
            self.ipAddress = ipAddress
            self.isLatestVersion = isLatestVersion
            self.lastAssociationExecutionDate = lastAssociationExecutionDate
            self.lastPingDateTime = lastPingDateTime
            self.lastSuccessfulAssociationExecutionDate = lastSuccessfulAssociationExecutionDate
            self.name = name
            self.pingStatus = pingStatus
            self.platformName = platformName
            self.platformType = platformType
            self.platformVersion = platformVersion
            self.registrationDate = registrationDate
            self.resourceType = resourceType
            self.sourceId = sourceId
            self.sourceType = sourceType
        }

        private enum CodingKeys: String, CodingKey {
            case activationId = "ActivationId"
            case agentVersion = "AgentVersion"
            case associationOverview = "AssociationOverview"
            case associationStatus = "AssociationStatus"
            case computerName = "ComputerName"
            case iamRole = "IamRole"
            case instanceId = "InstanceId"
            case ipAddress = "IPAddress"
            case isLatestVersion = "IsLatestVersion"
            case lastAssociationExecutionDate = "LastAssociationExecutionDate"
            case lastPingDateTime = "LastPingDateTime"
            case lastSuccessfulAssociationExecutionDate = "LastSuccessfulAssociationExecutionDate"
            case name = "Name"
            case pingStatus = "PingStatus"
            case platformName = "PlatformName"
            case platformType = "PlatformType"
            case platformVersion = "PlatformVersion"
            case registrationDate = "RegistrationDate"
            case resourceType = "ResourceType"
            case sourceId = "SourceId"
            case sourceType = "SourceType"
        }
    }

    public struct InstanceInformationFilter: AWSEncodableShape {
        /// The name of the filter.
        public let key: InstanceInformationFilterKey
        /// The filter values.
        public let valueSet: [String]

        @inlinable
        public init(key: InstanceInformationFilterKey, valueSet: [String]) {
            self.key = key
            self.valueSet = valueSet
        }

        public func validate(name: String) throws {
            try self.valueSet.forEach {
                try validate($0, name: "valueSet[]", parent: name, min: 1)
            }
            try self.validate(self.valueSet, name: "valueSet", parent: name, max: 100)
            try self.validate(self.valueSet, name: "valueSet", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "key"
            case valueSet = "valueSet"
        }
    }

    public struct InstanceInformationStringFilter: AWSEncodableShape {
        /// The filter key name to describe your managed nodes. Valid filter key values: ActivationIds | AgentVersion | AssociationStatus | IamRole | InstanceIds | PingStatus | PlatformType | ResourceType | SourceIds | SourceTypes | "tag-key" | "tag:{keyname}    Valid values for the AssociationStatus filter key: Success | Pending | Failed   Valid values for the PingStatus filter key: Online | ConnectionLost | Inactive (deprecated)   Valid values for the PlatformType filter key: Windows | Linux | MacOS   Valid values for the ResourceType filter key: EC2Instance | ManagedInstance   Valid values for the SourceType filter key: AWS::EC2::Instance | AWS::SSM::ManagedInstance | AWS::IoT::Thing   Valid tag examples: Key=tag-key,Values=Purpose | Key=tag:Purpose,Values=Test.
        public let key: String
        /// The filter values.
        public let values: [String]

        @inlinable
        public init(key: String, values: [String]) {
            self.key = key
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.values.forEach {
                try validate($0, name: "values[]", parent: name, min: 1)
            }
            try self.validate(self.values, name: "values", parent: name, max: 100)
            try self.validate(self.values, name: "values", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case values = "Values"
        }
    }

    public struct InstancePatchState: AWSDecodableShape {
        /// The number of security-related patches that are available but not approved because they didn't meet the patch baseline requirements. For example, an updated version of a patch might have been released before the specified auto-approval period was over. Applies to Windows Server managed nodes only.
        public let availableSecurityUpdateCount: Int?
        /// The ID of the patch baseline used to patch the managed node.
        public let baselineId: String
        /// The number of patches per node that are specified as Critical for compliance reporting in the patch baseline aren't installed. These patches might be missing, have failed installation, were rejected, or were installed but awaiting a required managed node reboot. The status of these managed nodes is NON_COMPLIANT.
        public let criticalNonCompliantCount: Int?
        /// The number of patches from the patch baseline that were attempted to be installed during the last patching operation, but failed to install.
        public let failedCount: Int?
        /// The number of patches from the patch baseline that are installed on the managed node.
        public let installedCount: Int?
        /// The number of patches not specified in the patch baseline that are installed on the managed node.
        public let installedOtherCount: Int?
        /// The number of patches installed by Patch Manager since the last time the managed node was rebooted.
        public let installedPendingRebootCount: Int?
        /// The number of patches installed on a managed node that are specified in a RejectedPatches list. Patches with a status of InstalledRejected were typically installed before they were added to a RejectedPatches list.  If ALLOW_AS_DEPENDENCY is the specified option for RejectedPatchesAction, the value of InstalledRejectedCount will always be 0 (zero).
        public let installedRejectedCount: Int?
        /// An https URL or an Amazon Simple Storage Service (Amazon S3) path-style URL to a list of patches to be installed. This patch installation list, which you maintain in an S3 bucket in YAML format and specify in the SSM document AWS-RunPatchBaseline, overrides the patches specified by the default patch baseline. For more information about the InstallOverrideList parameter, see SSM Command document for patching: AWS-RunPatchBaseline in the Amazon Web Services Systems Manager User Guide.
        public let installOverrideList: String?
        /// The ID of the managed node the high-level patch compliance information was collected for.
        public let instanceId: String
        /// The time of the last attempt to patch the managed node with NoReboot specified as the reboot option.
        public let lastNoRebootInstallOperationTime: Date?
        /// The number of patches from the patch baseline that are applicable for the managed node but aren't currently installed.
        public let missingCount: Int?
        /// The number of patches from the patch baseline that aren't applicable for the managed node and therefore aren't installed on the node. This number may be truncated if the list of patch names is very large. The number of patches beyond this limit are reported in UnreportedNotApplicableCount.
        public let notApplicableCount: Int?
        /// The type of patching operation that was performed: or     SCAN assesses the patch compliance state.    INSTALL installs missing patches.
        public let operation: PatchOperationType
        /// The time the most recent patching operation completed on the managed node.
        public let operationEndTime: Date
        /// The time the most recent patching operation was started on the managed node.
        public let operationStartTime: Date
        /// The number of patches per node that are specified as other than Critical or Security but aren't compliant with the patch baseline. The status of these managed nodes is NON_COMPLIANT.
        public let otherNonCompliantCount: Int?
        /// Placeholder information. This field will always be empty in the current release of the service.
        public let ownerInformation: String?
        /// The name of the patch group the managed node belongs to.
        public let patchGroup: String
        /// Indicates the reboot option specified in the patch baseline.  Reboot options apply to Install operations only. Reboots aren't attempted for Patch Manager Scan operations.     RebootIfNeeded: Patch Manager tries to reboot the managed node if it installed any patches, or if any patches are detected with a status of InstalledPendingReboot.    NoReboot: Patch Manager attempts to install missing packages without trying to reboot the system. Patches installed with this option are assigned a status of InstalledPendingReboot. These patches might not be in effect until a reboot is performed.
        public let rebootOption: RebootOption?
        /// The number of patches per node that are specified as Security in a patch advisory aren't installed. These patches might be missing, have failed installation, were rejected, or were installed but awaiting a required managed node reboot. The status of these managed nodes is NON_COMPLIANT.
        public let securityNonCompliantCount: Int?
        /// The ID of the patch baseline snapshot used during the patching operation when this compliance data was collected.
        public let snapshotId: String?
        /// The number of patches beyond the supported limit of NotApplicableCount that aren't reported by name to Inventory. Inventory is a tool in Amazon Web Services Systems Manager.
        public let unreportedNotApplicableCount: Int?

        @inlinable
        public init(availableSecurityUpdateCount: Int? = nil, baselineId: String, criticalNonCompliantCount: Int? = nil, failedCount: Int? = nil, installedCount: Int? = nil, installedOtherCount: Int? = nil, installedPendingRebootCount: Int? = nil, installedRejectedCount: Int? = nil, installOverrideList: String? = nil, instanceId: String, lastNoRebootInstallOperationTime: Date? = nil, missingCount: Int? = nil, notApplicableCount: Int? = nil, operation: PatchOperationType, operationEndTime: Date, operationStartTime: Date, otherNonCompliantCount: Int? = nil, ownerInformation: String? = nil, patchGroup: String, rebootOption: RebootOption? = nil, securityNonCompliantCount: Int? = nil, snapshotId: String? = nil, unreportedNotApplicableCount: Int? = nil) {
            self.availableSecurityUpdateCount = availableSecurityUpdateCount
            self.baselineId = baselineId
            self.criticalNonCompliantCount = criticalNonCompliantCount
            self.failedCount = failedCount
            self.installedCount = installedCount
            self.installedOtherCount = installedOtherCount
            self.installedPendingRebootCount = installedPendingRebootCount
            self.installedRejectedCount = installedRejectedCount
            self.installOverrideList = installOverrideList
            self.instanceId = instanceId
            self.lastNoRebootInstallOperationTime = lastNoRebootInstallOperationTime
            self.missingCount = missingCount
            self.notApplicableCount = notApplicableCount
            self.operation = operation
            self.operationEndTime = operationEndTime
            self.operationStartTime = operationStartTime
            self.otherNonCompliantCount = otherNonCompliantCount
            self.ownerInformation = ownerInformation
            self.patchGroup = patchGroup
            self.rebootOption = rebootOption
            self.securityNonCompliantCount = securityNonCompliantCount
            self.snapshotId = snapshotId
            self.unreportedNotApplicableCount = unreportedNotApplicableCount
        }

        private enum CodingKeys: String, CodingKey {
            case availableSecurityUpdateCount = "AvailableSecurityUpdateCount"
            case baselineId = "BaselineId"
            case criticalNonCompliantCount = "CriticalNonCompliantCount"
            case failedCount = "FailedCount"
            case installedCount = "InstalledCount"
            case installedOtherCount = "InstalledOtherCount"
            case installedPendingRebootCount = "InstalledPendingRebootCount"
            case installedRejectedCount = "InstalledRejectedCount"
            case installOverrideList = "InstallOverrideList"
            case instanceId = "InstanceId"
            case lastNoRebootInstallOperationTime = "LastNoRebootInstallOperationTime"
            case missingCount = "MissingCount"
            case notApplicableCount = "NotApplicableCount"
            case operation = "Operation"
            case operationEndTime = "OperationEndTime"
            case operationStartTime = "OperationStartTime"
            case otherNonCompliantCount = "OtherNonCompliantCount"
            case ownerInformation = "OwnerInformation"
            case patchGroup = "PatchGroup"
            case rebootOption = "RebootOption"
            case securityNonCompliantCount = "SecurityNonCompliantCount"
            case snapshotId = "SnapshotId"
            case unreportedNotApplicableCount = "UnreportedNotApplicableCount"
        }
    }

    public struct InstancePatchStateFilter: AWSEncodableShape {
        /// The key for the filter. Supported values include the following:    InstalledCount     InstalledOtherCount     InstalledPendingRebootCount     InstalledRejectedCount     MissingCount     FailedCount     UnreportedNotApplicableCount     NotApplicableCount
        public let key: String
        /// The type of comparison that should be performed for the value.
        public let type: InstancePatchStateOperatorType
        /// The value for the filter. Must be an integer greater than or equal to 0.
        public let values: [String]

        @inlinable
        public init(key: String, type: InstancePatchStateOperatorType, values: [String]) {
            self.key = key
            self.type = type
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 200)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.validate(self.values, name: "values", parent: name, max: 1)
            try self.validate(self.values, name: "values", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case type = "Type"
            case values = "Values"
        }
    }

    public struct InstanceProperty: AWSDecodableShape {
        /// The activation ID created by Systems Manager when the server or virtual machine (VM) was registered
        public let activationId: String?
        /// The version of SSM Agent running on your managed node.
        public let agentVersion: String?
        /// The CPU architecture of the node. For example, x86_64.
        public let architecture: String?
        public let associationOverview: InstanceAggregatedAssociationOverview?
        /// The status of the State Manager association applied to the managed node.
        public let associationStatus: String?
        /// The fully qualified host name of the managed node.
        public let computerName: String?
        /// The IAM role used in the hybrid activation to register the node with Systems Manager.
        public let iamRole: String?
        /// The ID of the managed node.
        public let instanceId: String?
        /// The instance profile attached to the node. If an instance profile isn't attached to the node, this value is blank.
        public let instanceRole: String?
        /// The current state of the node.
        public let instanceState: String?
        /// The instance type of the managed node. For example, t3.large.
        public let instanceType: String?
        /// The public IPv4 address assigned to the node. If a public IPv4 address isn't assigned to the node, this value is blank.
        public let ipAddress: String?
        /// The name of the key pair associated with the node. If a key pair isnt't associated with the node, this value is blank.
        public let keyName: String?
        /// The date the association was last run.
        public let lastAssociationExecutionDate: Date?
        /// The date and time when the SSM Agent last pinged the Systems Manager service.
        public let lastPingDateTime: Date?
        /// The last date the association was successfully run.
        public let lastSuccessfulAssociationExecutionDate: Date?
        /// The timestamp for when the node was launched.
        public let launchTime: Date?
        /// The value of the EC2 Name tag associated with the node. If a Name tag hasn't been applied to the node, this value is blank.
        public let name: String?
        /// Connection status of the SSM Agent on the managed node.
        public let pingStatus: PingStatus?
        /// The name of the operating system platform running on your managed node.
        public let platformName: String?
        /// The operating system platform type of the managed node. For example, Windows Server or Amazon Linux 2.
        public let platformType: PlatformType?
        /// The version of the OS platform running on your managed node.
        public let platformVersion: String?
        /// The date the node was registered with Systems Manager.
        public let registrationDate: Date?
        /// The type of managed node.
        public let resourceType: String?
        /// The ID of the source resource.
        public let sourceId: String?
        /// The type of the source resource.
        public let sourceType: SourceType?

        @inlinable
        public init(activationId: String? = nil, agentVersion: String? = nil, architecture: String? = nil, associationOverview: InstanceAggregatedAssociationOverview? = nil, associationStatus: String? = nil, computerName: String? = nil, iamRole: String? = nil, instanceId: String? = nil, instanceRole: String? = nil, instanceState: String? = nil, instanceType: String? = nil, ipAddress: String? = nil, keyName: String? = nil, lastAssociationExecutionDate: Date? = nil, lastPingDateTime: Date? = nil, lastSuccessfulAssociationExecutionDate: Date? = nil, launchTime: Date? = nil, name: String? = nil, pingStatus: PingStatus? = nil, platformName: String? = nil, platformType: PlatformType? = nil, platformVersion: String? = nil, registrationDate: Date? = nil, resourceType: String? = nil, sourceId: String? = nil, sourceType: SourceType? = nil) {
            self.activationId = activationId
            self.agentVersion = agentVersion
            self.architecture = architecture
            self.associationOverview = associationOverview
            self.associationStatus = associationStatus
            self.computerName = computerName
            self.iamRole = iamRole
            self.instanceId = instanceId
            self.instanceRole = instanceRole
            self.instanceState = instanceState
            self.instanceType = instanceType
            self.ipAddress = ipAddress
            self.keyName = keyName
            self.lastAssociationExecutionDate = lastAssociationExecutionDate
            self.lastPingDateTime = lastPingDateTime
            self.lastSuccessfulAssociationExecutionDate = lastSuccessfulAssociationExecutionDate
            self.launchTime = launchTime
            self.name = name
            self.pingStatus = pingStatus
            self.platformName = platformName
            self.platformType = platformType
            self.platformVersion = platformVersion
            self.registrationDate = registrationDate
            self.resourceType = resourceType
            self.sourceId = sourceId
            self.sourceType = sourceType
        }

        private enum CodingKeys: String, CodingKey {
            case activationId = "ActivationId"
            case agentVersion = "AgentVersion"
            case architecture = "Architecture"
            case associationOverview = "AssociationOverview"
            case associationStatus = "AssociationStatus"
            case computerName = "ComputerName"
            case iamRole = "IamRole"
            case instanceId = "InstanceId"
            case instanceRole = "InstanceRole"
            case instanceState = "InstanceState"
            case instanceType = "InstanceType"
            case ipAddress = "IPAddress"
            case keyName = "KeyName"
            case lastAssociationExecutionDate = "LastAssociationExecutionDate"
            case lastPingDateTime = "LastPingDateTime"
            case lastSuccessfulAssociationExecutionDate = "LastSuccessfulAssociationExecutionDate"
            case launchTime = "LaunchTime"
            case name = "Name"
            case pingStatus = "PingStatus"
            case platformName = "PlatformName"
            case platformType = "PlatformType"
            case platformVersion = "PlatformVersion"
            case registrationDate = "RegistrationDate"
            case resourceType = "ResourceType"
            case sourceId = "SourceId"
            case sourceType = "SourceType"
        }
    }

    public struct InstancePropertyFilter: AWSEncodableShape {
        /// The name of the filter.
        public let key: InstancePropertyFilterKey
        /// The filter values.
        public let valueSet: [String]

        @inlinable
        public init(key: InstancePropertyFilterKey, valueSet: [String]) {
            self.key = key
            self.valueSet = valueSet
        }

        public func validate(name: String) throws {
            try self.valueSet.forEach {
                try validate($0, name: "valueSet[]", parent: name, max: 100000)
                try validate($0, name: "valueSet[]", parent: name, min: 1)
                try validate($0, name: "valueSet[]", parent: name, pattern: "^.{1,100000}$")
            }
            try self.validate(self.valueSet, name: "valueSet", parent: name, max: 40)
            try self.validate(self.valueSet, name: "valueSet", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "key"
            case valueSet = "valueSet"
        }
    }

    public struct InstancePropertyStringFilter: AWSEncodableShape {
        /// The filter key name to describe your managed nodes.
        public let key: String
        /// The operator used by the filter call.
        public let `operator`: InstancePropertyFilterOperator?
        /// The filter key name to describe your managed nodes.
        public let values: [String]

        @inlinable
        public init(key: String, operator: InstancePropertyFilterOperator? = nil, values: [String]) {
            self.key = key
            self.`operator` = `operator`
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 100000)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.validate(self.key, name: "key", parent: name, pattern: "^.{1,100000}$")
            try self.values.forEach {
                try validate($0, name: "values[]", parent: name, max: 100000)
                try validate($0, name: "values[]", parent: name, min: 1)
                try validate($0, name: "values[]", parent: name, pattern: "^.{1,100000}$")
            }
            try self.validate(self.values, name: "values", parent: name, max: 40)
            try self.validate(self.values, name: "values", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case `operator` = "Operator"
            case values = "Values"
        }
    }

    public struct InvalidItemContentException: AWSErrorShape {
        public let message: String?
        public let typeName: String?

        @inlinable
        public init(message: String? = nil, typeName: String? = nil) {
            self.message = message
            self.typeName = typeName
        }

        private enum CodingKeys: String, CodingKey {
            case message = "Message"
            case typeName = "TypeName"
        }
    }

    public struct InventoryAggregator: AWSEncodableShape {
        /// Nested aggregators to further refine aggregation for an inventory type.
        public let aggregators: [InventoryAggregator]?
        /// The inventory type and attribute name for aggregation.
        public let expression: String?
        /// A user-defined set of one or more filters on which to aggregate inventory data. Groups return a count of resources that match and don't match the specified criteria.
        public let groups: [InventoryGroup]?

        @inlinable
        public init(aggregators: [InventoryAggregator]? = nil, expression: String? = nil, groups: [InventoryGroup]? = nil) {
            self.aggregators = aggregators
            self.expression = expression
            self.groups = groups
        }

        public func validate(name: String) throws {
            try self.aggregators?.forEach {
                try $0.validate(name: "\(name).aggregators[]")
            }
            try self.validate(self.aggregators, name: "aggregators", parent: name, max: 10)
            try self.validate(self.aggregators, name: "aggregators", parent: name, min: 1)
            try self.validate(self.expression, name: "expression", parent: name, max: 1000)
            try self.validate(self.expression, name: "expression", parent: name, min: 1)
            try self.groups?.forEach {
                try $0.validate(name: "\(name).groups[]")
            }
            try self.validate(self.groups, name: "groups", parent: name, max: 15)
            try self.validate(self.groups, name: "groups", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case aggregators = "Aggregators"
            case expression = "Expression"
            case groups = "Groups"
        }
    }

    public struct InventoryDeletionStatusItem: AWSDecodableShape {
        /// The deletion ID returned by the DeleteInventory operation.
        public let deletionId: String?
        /// The UTC timestamp when the delete operation started.
        public let deletionStartTime: Date?
        /// Information about the delete operation. For more information about this summary, see Understanding the delete inventory summary in the Amazon Web Services Systems Manager User Guide.
        public let deletionSummary: InventoryDeletionSummary?
        /// The status of the operation. Possible values are InProgress and Complete.
        public let lastStatus: InventoryDeletionStatus?
        /// Information about the status.
        public let lastStatusMessage: String?
        /// The UTC timestamp of when the last status report.
        public let lastStatusUpdateTime: Date?
        /// The name of the inventory data type.
        public let typeName: String?

        @inlinable
        public init(deletionId: String? = nil, deletionStartTime: Date? = nil, deletionSummary: InventoryDeletionSummary? = nil, lastStatus: InventoryDeletionStatus? = nil, lastStatusMessage: String? = nil, lastStatusUpdateTime: Date? = nil, typeName: String? = nil) {
            self.deletionId = deletionId
            self.deletionStartTime = deletionStartTime
            self.deletionSummary = deletionSummary
            self.lastStatus = lastStatus
            self.lastStatusMessage = lastStatusMessage
            self.lastStatusUpdateTime = lastStatusUpdateTime
            self.typeName = typeName
        }

        private enum CodingKeys: String, CodingKey {
            case deletionId = "DeletionId"
            case deletionStartTime = "DeletionStartTime"
            case deletionSummary = "DeletionSummary"
            case lastStatus = "LastStatus"
            case lastStatusMessage = "LastStatusMessage"
            case lastStatusUpdateTime = "LastStatusUpdateTime"
            case typeName = "TypeName"
        }
    }

    public struct InventoryDeletionSummary: AWSDecodableShape {
        /// Remaining number of items to delete.
        public let remainingCount: Int?
        /// A list of counts and versions for deleted items.
        public let summaryItems: [InventoryDeletionSummaryItem]?
        /// The total number of items to delete. This count doesn't change during the delete operation.
        public let totalCount: Int?

        @inlinable
        public init(remainingCount: Int? = nil, summaryItems: [InventoryDeletionSummaryItem]? = nil, totalCount: Int? = nil) {
            self.remainingCount = remainingCount
            self.summaryItems = summaryItems
            self.totalCount = totalCount
        }

        private enum CodingKeys: String, CodingKey {
            case remainingCount = "RemainingCount"
            case summaryItems = "SummaryItems"
            case totalCount = "TotalCount"
        }
    }

    public struct InventoryDeletionSummaryItem: AWSDecodableShape {
        /// A count of the number of deleted items.
        public let count: Int?
        /// The remaining number of items to delete.
        public let remainingCount: Int?
        /// The inventory type version.
        public let version: String?

        @inlinable
        public init(count: Int? = nil, remainingCount: Int? = nil, version: String? = nil) {
            self.count = count
            self.remainingCount = remainingCount
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case count = "Count"
            case remainingCount = "RemainingCount"
            case version = "Version"
        }
    }

    public struct InventoryFilter: AWSEncodableShape {
        /// The name of the filter key.
        public let key: String
        /// The type of filter.  The Exists filter must be used with aggregators. For more information, see Aggregating inventory data in the Amazon Web Services Systems Manager User Guide.
        public let type: InventoryQueryOperatorType?
        /// Inventory filter values.
        public let values: [String]

        @inlinable
        public init(key: String, type: InventoryQueryOperatorType? = nil, values: [String]) {
            self.key = key
            self.type = type
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 200)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.validate(self.values, name: "values", parent: name, max: 40)
            try self.validate(self.values, name: "values", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case type = "Type"
            case values = "Values"
        }
    }

    public struct InventoryGroup: AWSEncodableShape {
        /// Filters define the criteria for the group. The matchingCount field displays the number of resources that match the criteria. The notMatchingCount field displays the number of resources that don't match the criteria.
        public let filters: [InventoryFilter]
        /// The name of the group.
        public let name: String

        @inlinable
        public init(filters: [InventoryFilter], name: String) {
            self.filters = filters
            self.name = name
        }

        public func validate(name: String) throws {
            try self.filters.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.filters, name: "filters", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 200)
            try self.validate(self.name, name: "name", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case name = "Name"
        }
    }

    public struct InventoryItem: AWSEncodableShape {
        /// The time the inventory information was collected.
        public let captureTime: String
        /// The inventory data of the inventory type.
        public let content: [[String: String]]?
        /// MD5 hash of the inventory item type contents. The content hash is used to determine whether to update inventory information. The PutInventory API doesn't update the inventory item type contents if the MD5 hash hasn't changed since last update.
        public let contentHash: String?
        /// A map of associated properties for a specified inventory type. For example, with this attribute, you can specify the ExecutionId, ExecutionType, ComplianceType properties of the AWS:ComplianceItem type.
        public let context: [String: String]?
        /// The schema version for the inventory item.
        public let schemaVersion: String
        /// The name of the inventory type. Default inventory item type names start with AWS. Custom inventory type names will start with Custom. Default inventory item types include the following: AWS:AWSComponent, AWS:Application, AWS:InstanceInformation, AWS:Network, and AWS:WindowsUpdate.
        public let typeName: String

        @inlinable
        public init(captureTime: String, content: [[String: String]]? = nil, contentHash: String? = nil, context: [String: String]? = nil, schemaVersion: String, typeName: String) {
            self.captureTime = captureTime
            self.content = content
            self.contentHash = contentHash
            self.context = context
            self.schemaVersion = schemaVersion
            self.typeName = typeName
        }

        public func validate(name: String) throws {
            try self.validate(self.captureTime, name: "captureTime", parent: name, pattern: "^(20)[0-9][0-9]-(0[1-9]|1[012])-([12][0-9]|3[01]|0[1-9])(T)(2[0-3]|[0-1][0-9])(:[0-5][0-9])(:[0-5][0-9])(Z)$")
            try self.content?.forEach {
                try validate($0, name: "content[]", parent: name, max: 50)
            }
            try self.validate(self.content, name: "content", parent: name, max: 10000)
            try self.validate(self.contentHash, name: "contentHash", parent: name, max: 256)
            try self.context?.forEach {
                try validate($0.key, name: "context.key", parent: name, max: 64)
                try validate($0.key, name: "context.key", parent: name, min: 1)
                try validate($0.value, name: "context[\"\($0.key)\"]", parent: name, max: 4096)
            }
            try self.validate(self.context, name: "context", parent: name, max: 50)
            try self.validate(self.schemaVersion, name: "schemaVersion", parent: name, pattern: "^([0-9]{1,6})(\\.[0-9]{1,6})$")
            try self.validate(self.typeName, name: "typeName", parent: name, max: 100)
            try self.validate(self.typeName, name: "typeName", parent: name, min: 1)
            try self.validate(self.typeName, name: "typeName", parent: name, pattern: "^(AWS|Custom):.*$")
        }

        private enum CodingKeys: String, CodingKey {
            case captureTime = "CaptureTime"
            case content = "Content"
            case contentHash = "ContentHash"
            case context = "Context"
            case schemaVersion = "SchemaVersion"
            case typeName = "TypeName"
        }
    }

    public struct InventoryItemAttribute: AWSDecodableShape {
        /// The data type of the inventory item attribute.
        public let dataType: InventoryAttributeDataType
        /// Name of the inventory item attribute.
        public let name: String

        @inlinable
        public init(dataType: InventoryAttributeDataType, name: String) {
            self.dataType = dataType
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case dataType = "DataType"
            case name = "Name"
        }
    }

    public struct InventoryItemSchema: AWSDecodableShape {
        /// The schema attributes for inventory. This contains data type and attribute name.
        public let attributes: [InventoryItemAttribute]
        /// The alias name of the inventory type. The alias name is used for display purposes.
        public let displayName: String?
        /// The name of the inventory type. Default inventory item type names start with Amazon Web Services. Custom inventory type names will start with Custom. Default inventory item types include the following: AWS:AWSComponent, AWS:Application, AWS:InstanceInformation, AWS:Network, and AWS:WindowsUpdate.
        public let typeName: String
        /// The schema version for the inventory item.
        public let version: String?

        @inlinable
        public init(attributes: [InventoryItemAttribute], displayName: String? = nil, typeName: String, version: String? = nil) {
            self.attributes = attributes
            self.displayName = displayName
            self.typeName = typeName
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
            case displayName = "DisplayName"
            case typeName = "TypeName"
            case version = "Version"
        }
    }

    public struct InventoryResultEntity: AWSDecodableShape {
        /// The data section in the inventory result entity JSON.
        public let data: [String: InventoryResultItem]?
        /// ID of the inventory result entity. For example, for managed node inventory the result will be the managed node ID. For EC2 instance inventory, the result will be the instance ID.
        public let id: String?

        @inlinable
        public init(data: [String: InventoryResultItem]? = nil, id: String? = nil) {
            self.data = data
            self.id = id
        }

        private enum CodingKeys: String, CodingKey {
            case data = "Data"
            case id = "Id"
        }
    }

    public struct InventoryResultItem: AWSDecodableShape {
        /// The time inventory item data was captured.
        public let captureTime: String?
        /// Contains all the inventory data of the item type. Results include attribute names and values.
        public let content: [[String: String]]
        /// MD5 hash of the inventory item type contents. The content hash is used to determine whether to update inventory information. The PutInventory API doesn't update the inventory item type contents if the MD5 hash hasn't changed since last update.
        public let contentHash: String?
        /// The schema version for the inventory result item/
        public let schemaVersion: String
        /// The name of the inventory result item type.
        public let typeName: String

        @inlinable
        public init(captureTime: String? = nil, content: [[String: String]], contentHash: String? = nil, schemaVersion: String, typeName: String) {
            self.captureTime = captureTime
            self.content = content
            self.contentHash = contentHash
            self.schemaVersion = schemaVersion
            self.typeName = typeName
        }

        private enum CodingKeys: String, CodingKey {
            case captureTime = "CaptureTime"
            case content = "Content"
            case contentHash = "ContentHash"
            case schemaVersion = "SchemaVersion"
            case typeName = "TypeName"
        }
    }

    public struct ItemContentMismatchException: AWSErrorShape {
        public let message: String?
        public let typeName: String?

        @inlinable
        public init(message: String? = nil, typeName: String? = nil) {
            self.message = message
            self.typeName = typeName
        }

        private enum CodingKeys: String, CodingKey {
            case message = "Message"
            case typeName = "TypeName"
        }
    }

    public struct ItemSizeLimitExceededException: AWSErrorShape {
        public let message: String?
        public let typeName: String?

        @inlinable
        public init(message: String? = nil, typeName: String? = nil) {
            self.message = message
            self.typeName = typeName
        }

        private enum CodingKeys: String, CodingKey {
            case message = "Message"
            case typeName = "TypeName"
        }
    }

    public struct LabelParameterVersionRequest: AWSEncodableShape {
        /// One or more labels to attach to the specified parameter version.
        public let labels: [String]
        /// The parameter name on which you want to attach one or more labels.  You can't enter the Amazon Resource Name (ARN) for a parameter, only the parameter name itself.
        public let name: String
        /// The specific version of the parameter on which you want to attach one or more labels. If no version is specified, the system attaches the label to the latest version.
        public let parameterVersion: Int64?

        @inlinable
        public init(labels: [String], name: String, parameterVersion: Int64? = nil) {
            self.labels = labels
            self.name = name
            self.parameterVersion = parameterVersion
        }

        public func validate(name: String) throws {
            try self.labels.forEach {
                try validate($0, name: "labels[]", parent: name, max: 100)
                try validate($0, name: "labels[]", parent: name, min: 1)
            }
            try self.validate(self.labels, name: "labels", parent: name, max: 10)
            try self.validate(self.labels, name: "labels", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 2048)
            try self.validate(self.name, name: "name", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case labels = "Labels"
            case name = "Name"
            case parameterVersion = "ParameterVersion"
        }
    }

    public struct LabelParameterVersionResult: AWSDecodableShape {
        /// The label doesn't meet the requirements. For information about parameter label requirements, see Working with parameter labels in the Amazon Web Services Systems Manager User Guide.
        public let invalidLabels: [String]?
        /// The version of the parameter that has been labeled.
        public let parameterVersion: Int64?

        @inlinable
        public init(invalidLabels: [String]? = nil, parameterVersion: Int64? = nil) {
            self.invalidLabels = invalidLabels
            self.parameterVersion = parameterVersion
        }

        private enum CodingKeys: String, CodingKey {
            case invalidLabels = "InvalidLabels"
            case parameterVersion = "ParameterVersion"
        }
    }

    public struct ListAssociationVersionsRequest: AWSEncodableShape {
        /// The association ID for which you want to view all versions.
        public let associationId: String
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(associationId: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.associationId = associationId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.associationId, name: "associationId", parent: name, pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case associationId = "AssociationId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListAssociationVersionsResult: AWSDecodableShape {
        /// Information about all versions of the association for the specified association ID.
        public let associationVersions: [AssociationVersionInfo]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(associationVersions: [AssociationVersionInfo]? = nil, nextToken: String? = nil) {
            self.associationVersions = associationVersions
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case associationVersions = "AssociationVersions"
            case nextToken = "NextToken"
        }
    }

    public struct ListAssociationsRequest: AWSEncodableShape {
        /// One or more filters. Use a filter to return a more specific list of results.  Filtering associations using the InstanceID attribute only returns legacy associations created using the InstanceID attribute. Associations targeting the managed node that are part of the Target Attributes ResourceGroup or Tags aren't returned.
        public let associationFilterList: [AssociationFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(associationFilterList: [AssociationFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.associationFilterList = associationFilterList
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.associationFilterList?.forEach {
                try $0.validate(name: "\(name).associationFilterList[]")
            }
            try self.validate(self.associationFilterList, name: "associationFilterList", parent: name, min: 1)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case associationFilterList = "AssociationFilterList"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListAssociationsResult: AWSDecodableShape {
        /// The associations.
        public let associations: [Association]?
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?

        @inlinable
        public init(associations: [Association]? = nil, nextToken: String? = nil) {
            self.associations = associations
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case associations = "Associations"
            case nextToken = "NextToken"
        }
    }

    public struct ListCommandInvocationsRequest: AWSEncodableShape {
        /// (Optional) The invocations for a specific command ID.
        public let commandId: String?
        /// (Optional) If set this returns the response of the command executions and any command output. The default value is false.
        public let details: Bool?
        /// (Optional) One or more filters. Use a filter to return a more specific list of results.
        public let filters: [CommandFilter]?
        /// (Optional) The command execution details for a specific managed node ID.
        public let instanceId: String?
        /// (Optional) The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// (Optional) The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(commandId: String? = nil, details: Bool? = nil, filters: [CommandFilter]? = nil, instanceId: String? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.commandId = commandId
            self.details = details
            self.filters = filters
            self.instanceId = instanceId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.commandId, name: "commandId", parent: name, max: 36)
            try self.validate(self.commandId, name: "commandId", parent: name, min: 36)
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.filters, name: "filters", parent: name, min: 1)
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case commandId = "CommandId"
            case details = "Details"
            case filters = "Filters"
            case instanceId = "InstanceId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListCommandInvocationsResult: AWSDecodableShape {
        /// (Optional) A list of all invocations.
        public let commandInvocations: [CommandInvocation]?
        /// (Optional) The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(commandInvocations: [CommandInvocation]? = nil, nextToken: String? = nil) {
            self.commandInvocations = commandInvocations
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case commandInvocations = "CommandInvocations"
            case nextToken = "NextToken"
        }
    }

    public struct ListCommandsRequest: AWSEncodableShape {
        /// (Optional) If provided, lists only the specified command.
        public let commandId: String?
        /// (Optional) One or more filters. Use a filter to return a more specific list of results.
        public let filters: [CommandFilter]?
        /// (Optional) Lists commands issued against this managed node ID.  You can't specify a managed node ID in the same command that you specify Status = Pending. This is because the command hasn't reached the managed node yet.
        public let instanceId: String?
        /// (Optional) The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// (Optional) The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(commandId: String? = nil, filters: [CommandFilter]? = nil, instanceId: String? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.commandId = commandId
            self.filters = filters
            self.instanceId = instanceId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.commandId, name: "commandId", parent: name, max: 36)
            try self.validate(self.commandId, name: "commandId", parent: name, min: 36)
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.filters, name: "filters", parent: name, min: 1)
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case commandId = "CommandId"
            case filters = "Filters"
            case instanceId = "InstanceId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListCommandsResult: AWSDecodableShape {
        /// (Optional) The list of commands requested by the user.
        public let commands: [Command]?
        /// (Optional) The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(commands: [Command]? = nil, nextToken: String? = nil) {
            self.commands = commands
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case commands = "Commands"
            case nextToken = "NextToken"
        }
    }

    public struct ListComplianceItemsRequest: AWSEncodableShape {
        /// One or more compliance filters. Use a filter to return a more specific list of results.
        public let filters: [ComplianceStringFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?
        /// The ID for the resources from which to get compliance information. Currently, you can only specify one resource ID.
        public let resourceIds: [String]?
        /// The type of resource from which to get compliance information. Currently, the only supported resource type is ManagedInstance.
        public let resourceTypes: [String]?

        @inlinable
        public init(filters: [ComplianceStringFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, resourceIds: [String]? = nil, resourceTypes: [String]? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.resourceIds = resourceIds
            self.resourceTypes = resourceTypes
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.resourceIds?.forEach {
                try validate($0, name: "resourceIds[]", parent: name, max: 100)
                try validate($0, name: "resourceIds[]", parent: name, min: 1)
            }
            try self.validate(self.resourceIds, name: "resourceIds", parent: name, min: 1)
            try self.resourceTypes?.forEach {
                try validate($0, name: "resourceTypes[]", parent: name, max: 50)
                try validate($0, name: "resourceTypes[]", parent: name, min: 1)
            }
            try self.validate(self.resourceTypes, name: "resourceTypes", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case resourceIds = "ResourceIds"
            case resourceTypes = "ResourceTypes"
        }
    }

    public struct ListComplianceItemsResult: AWSDecodableShape {
        /// A list of compliance information for the specified resource ID.
        public let complianceItems: [ComplianceItem]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(complianceItems: [ComplianceItem]? = nil, nextToken: String? = nil) {
            self.complianceItems = complianceItems
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case complianceItems = "ComplianceItems"
            case nextToken = "NextToken"
        }
    }

    public struct ListComplianceSummariesRequest: AWSEncodableShape {
        /// One or more compliance or inventory filters. Use a filter to return a more specific list of results.
        public let filters: [ComplianceStringFilter]?
        /// The maximum number of items to return for this call. Currently, you can specify null or 50. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(filters: [ComplianceStringFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListComplianceSummariesResult: AWSDecodableShape {
        /// A list of compliant and non-compliant summary counts based on compliance types. For example, this call returns State Manager associations, patches, or custom compliance types according to the filter criteria that you specified.
        public let complianceSummaryItems: [ComplianceSummaryItem]?
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(complianceSummaryItems: [ComplianceSummaryItem]? = nil, nextToken: String? = nil) {
            self.complianceSummaryItems = complianceSummaryItems
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case complianceSummaryItems = "ComplianceSummaryItems"
            case nextToken = "NextToken"
        }
    }

    public struct ListDocumentMetadataHistoryRequest: AWSEncodableShape {
        /// The version of the change template.
        public let documentVersion: String?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The type of data for which details are being requested. Currently, the only supported value is DocumentReviews.
        public let metadata: DocumentMetadataEnum
        /// The name of the change template.
        public let name: String
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(documentVersion: String? = nil, maxResults: Int? = nil, metadata: DocumentMetadataEnum, name: String, nextToken: String? = nil) {
            self.documentVersion = documentVersion
            self.maxResults = maxResults
            self.metadata = metadata
            self.name = name
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case documentVersion = "DocumentVersion"
            case maxResults = "MaxResults"
            case metadata = "Metadata"
            case name = "Name"
            case nextToken = "NextToken"
        }
    }

    public struct ListDocumentMetadataHistoryResponse: AWSDecodableShape {
        /// The user ID of the person in the organization who requested the review of the change template.
        public let author: String?
        /// The version of the change template.
        public let documentVersion: String?
        /// Information about the response to the change template approval request.
        public let metadata: DocumentMetadataResponseInfo?
        /// The name of the change template.
        public let name: String?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(author: String? = nil, documentVersion: String? = nil, metadata: DocumentMetadataResponseInfo? = nil, name: String? = nil, nextToken: String? = nil) {
            self.author = author
            self.documentVersion = documentVersion
            self.metadata = metadata
            self.name = name
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case author = "Author"
            case documentVersion = "DocumentVersion"
            case metadata = "Metadata"
            case name = "Name"
            case nextToken = "NextToken"
        }
    }

    public struct ListDocumentVersionsRequest: AWSEncodableShape {
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The name of the document. You can specify an Amazon Resource Name (ARN).
        public let name: String
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(maxResults: Int? = nil, name: String, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.name = name
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.:/]{3,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case name = "Name"
            case nextToken = "NextToken"
        }
    }

    public struct ListDocumentVersionsResult: AWSDecodableShape {
        /// The document versions.
        public let documentVersions: [DocumentVersionInfo]?
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?

        @inlinable
        public init(documentVersions: [DocumentVersionInfo]? = nil, nextToken: String? = nil) {
            self.documentVersions = documentVersions
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case documentVersions = "DocumentVersions"
            case nextToken = "NextToken"
        }
    }

    public struct ListDocumentsRequest: AWSEncodableShape {
        /// This data type is deprecated. Instead, use Filters.
        public let documentFilterList: [DocumentFilter]?
        /// One or more DocumentKeyValuesFilter objects. Use a filter to return a more specific list of results. For keys, you can specify one or more key-value pair tags that have been applied to a document. Other valid keys include Owner, Name, PlatformTypes, DocumentType, and TargetType. For example, to return documents you own use Key=Owner,Values=Self. To specify a custom key-value pair, use the format Key=tag:tagName,Values=valueName.  This API operation only supports filtering documents by using a single tag key and one or more tag values. For example: Key=tag:tagName,Values=valueName1,valueName2
        public let filters: [DocumentKeyValuesFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(documentFilterList: [DocumentFilter]? = nil, filters: [DocumentKeyValuesFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.documentFilterList = documentFilterList
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.documentFilterList?.forEach {
                try $0.validate(name: "\(name).documentFilterList[]")
            }
            try self.validate(self.documentFilterList, name: "documentFilterList", parent: name, min: 1)
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 6)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case documentFilterList = "DocumentFilterList"
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListDocumentsResult: AWSDecodableShape {
        /// The names of the SSM documents.
        public let documentIdentifiers: [DocumentIdentifier]?
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?

        @inlinable
        public init(documentIdentifiers: [DocumentIdentifier]? = nil, nextToken: String? = nil) {
            self.documentIdentifiers = documentIdentifiers
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case documentIdentifiers = "DocumentIdentifiers"
            case nextToken = "NextToken"
        }
    }

    public struct ListInventoryEntriesRequest: AWSEncodableShape {
        /// One or more filters. Use a filter to return a more specific list of results.
        public let filters: [InventoryFilter]?
        /// The managed node ID for which you want inventory information.
        public let instanceId: String
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The type of inventory item for which you want information.
        public let typeName: String

        @inlinable
        public init(filters: [InventoryFilter]? = nil, instanceId: String, maxResults: Int? = nil, nextToken: String? = nil, typeName: String) {
            self.filters = filters
            self.instanceId = instanceId
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.typeName = typeName
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.filters, name: "filters", parent: name, min: 1)
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.typeName, name: "typeName", parent: name, max: 100)
            try self.validate(self.typeName, name: "typeName", parent: name, min: 1)
            try self.validate(self.typeName, name: "typeName", parent: name, pattern: "^(AWS|Custom):.*$")
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case instanceId = "InstanceId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case typeName = "TypeName"
        }
    }

    public struct ListInventoryEntriesResult: AWSDecodableShape {
        /// The time that inventory information was collected for the managed nodes.
        public let captureTime: String?
        /// A list of inventory items on the managed nodes.
        public let entries: [[String: String]]?
        /// The managed node ID targeted by the request to query inventory information.
        public let instanceId: String?
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?
        /// The inventory schema version used by the managed nodes.
        public let schemaVersion: String?
        /// The type of inventory item returned by the request.
        public let typeName: String?

        @inlinable
        public init(captureTime: String? = nil, entries: [[String: String]]? = nil, instanceId: String? = nil, nextToken: String? = nil, schemaVersion: String? = nil, typeName: String? = nil) {
            self.captureTime = captureTime
            self.entries = entries
            self.instanceId = instanceId
            self.nextToken = nextToken
            self.schemaVersion = schemaVersion
            self.typeName = typeName
        }

        private enum CodingKeys: String, CodingKey {
            case captureTime = "CaptureTime"
            case entries = "Entries"
            case instanceId = "InstanceId"
            case nextToken = "NextToken"
            case schemaVersion = "SchemaVersion"
            case typeName = "TypeName"
        }
    }

    public struct ListNodesRequest: AWSEncodableShape {
        /// One or more filters. Use a filter to return a more specific list of managed nodes.
        public let filters: [NodeFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The name of the Amazon Web Services managed resource data sync to retrieve information about. For cross-account/cross-Region configurations, this parameter is required, and the name of the supported resource data sync is AWS-QuickSetup-ManagedNode. For single account/single-Region configurations, the parameter is not required.
        public let syncName: String?

        @inlinable
        public init(filters: [NodeFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, syncName: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.syncName = syncName
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.filters, name: "filters", parent: name, min: 1)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.syncName, name: "syncName", parent: name, max: 64)
            try self.validate(self.syncName, name: "syncName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case syncName = "SyncName"
        }
    }

    public struct ListNodesResult: AWSDecodableShape {
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?
        /// A list of managed nodes that match the specified filter criteria.
        public let nodes: [Node]?

        @inlinable
        public init(nextToken: String? = nil, nodes: [Node]? = nil) {
            self.nextToken = nextToken
            self.nodes = nodes
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case nodes = "Nodes"
        }
    }

    public struct ListNodesSummaryRequest: AWSEncodableShape {
        /// Specify one or more aggregators to return a count of managed nodes that match that expression. For example, a count of managed nodes by operating system.
        public let aggregators: [NodeAggregator]
        /// One or more filters. Use a filter to generate a summary that matches your specified filter criteria.
        public let filters: [NodeFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.) The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let nextToken: String?
        /// The name of the Amazon Web Services managed resource data sync to retrieve information about. For cross-account/cross-Region configurations, this parameter is required, and the name of the supported resource data sync is AWS-QuickSetup-ManagedNode. For single account/single-Region configurations, the parameter is not required.
        public let syncName: String?

        @inlinable
        public init(aggregators: [NodeAggregator], filters: [NodeFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, syncName: String? = nil) {
            self.aggregators = aggregators
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.syncName = syncName
        }

        public func validate(name: String) throws {
            try self.aggregators.forEach {
                try $0.validate(name: "\(name).aggregators[]")
            }
            try self.validate(self.aggregators, name: "aggregators", parent: name, max: 2)
            try self.validate(self.aggregators, name: "aggregators", parent: name, min: 1)
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.filters, name: "filters", parent: name, min: 1)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.syncName, name: "syncName", parent: name, max: 64)
            try self.validate(self.syncName, name: "syncName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case aggregators = "Aggregators"
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case syncName = "SyncName"
        }
    }

    public struct ListNodesSummaryResult: AWSDecodableShape {
        /// The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.
        public let nextToken: String?
        /// A collection of objects reporting information about your managed nodes, such as the count of nodes by operating system.
        public let summary: [[String: String]]?

        @inlinable
        public init(nextToken: String? = nil, summary: [[String: String]]? = nil) {
            self.nextToken = nextToken
            self.summary = summary
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case summary = "Summary"
        }
    }

    public struct ListOpsItemEventsRequest: AWSEncodableShape {
        /// One or more OpsItem filters. Use a filter to return a more specific list of results.
        public let filters: [OpsItemEventFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(filters: [OpsItemEventFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListOpsItemEventsResponse: AWSDecodableShape {
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?
        /// A list of event information for the specified OpsItems.
        public let summaries: [OpsItemEventSummary]?

        @inlinable
        public init(nextToken: String? = nil, summaries: [OpsItemEventSummary]? = nil) {
            self.nextToken = nextToken
            self.summaries = summaries
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case summaries = "Summaries"
        }
    }

    public struct ListOpsItemRelatedItemsRequest: AWSEncodableShape {
        /// One or more OpsItem filters. Use a filter to return a more specific list of results.
        public let filters: [OpsItemRelatedItemsFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The ID of the OpsItem for which you want to list all related-item resources.
        public let opsItemId: String?

        @inlinable
        public init(filters: [OpsItemRelatedItemsFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil, opsItemId: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.opsItemId = opsItemId
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.opsItemId, name: "opsItemId", parent: name, pattern: "^(oi)-[0-9a-f]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case opsItemId = "OpsItemId"
        }
    }

    public struct ListOpsItemRelatedItemsResponse: AWSDecodableShape {
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?
        /// A list of related-item resources for the specified OpsItem.
        public let summaries: [OpsItemRelatedItemSummary]?

        @inlinable
        public init(nextToken: String? = nil, summaries: [OpsItemRelatedItemSummary]? = nil) {
            self.nextToken = nextToken
            self.summaries = summaries
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case summaries = "Summaries"
        }
    }

    public struct ListOpsMetadataRequest: AWSEncodableShape {
        /// One or more filters to limit the number of OpsMetadata objects returned by the call.
        public let filters: [OpsMetadataFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(filters: [OpsMetadataFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 10)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListOpsMetadataResult: AWSDecodableShape {
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?
        /// Returns a list of OpsMetadata objects.
        public let opsMetadataList: [OpsMetadata]?

        @inlinable
        public init(nextToken: String? = nil, opsMetadataList: [OpsMetadata]? = nil) {
            self.nextToken = nextToken
            self.opsMetadataList = opsMetadataList
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case opsMetadataList = "OpsMetadataList"
        }
    }

    public struct ListResourceComplianceSummariesRequest: AWSEncodableShape {
        /// One or more filters. Use a filter to return a more specific list of results.
        public let filters: [ComplianceStringFilter]?
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(filters: [ComplianceStringFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListResourceComplianceSummariesResult: AWSDecodableShape {
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?
        /// A summary count for specified or targeted managed nodes. Summary count includes information about compliant and non-compliant State Manager associations, patch status, or custom items according to the filter criteria that you specify.
        public let resourceComplianceSummaryItems: [ResourceComplianceSummaryItem]?

        @inlinable
        public init(nextToken: String? = nil, resourceComplianceSummaryItems: [ResourceComplianceSummaryItem]? = nil) {
            self.nextToken = nextToken
            self.resourceComplianceSummaryItems = resourceComplianceSummaryItems
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case resourceComplianceSummaryItems = "ResourceComplianceSummaryItems"
        }
    }

    public struct ListResourceDataSyncRequest: AWSEncodableShape {
        /// The maximum number of items to return for this call. The call also returns a token that you can specify in a subsequent call to get the next set of results.
        public let maxResults: Int?
        /// A token to start the list. Use this token to get the next set of results.
        public let nextToken: String?
        /// View a list of resource data syncs according to the sync type. Specify SyncToDestination to view resource data syncs that synchronize data to an Amazon S3 bucket. Specify SyncFromSource to view resource data syncs from Organizations or from multiple Amazon Web Services Regions.
        public let syncType: String?

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil, syncType: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.syncType = syncType
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.syncType, name: "syncType", parent: name, max: 64)
            try self.validate(self.syncType, name: "syncType", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case syncType = "SyncType"
        }
    }

    public struct ListResourceDataSyncResult: AWSDecodableShape {
        /// The token for the next set of items to return. Use this token to get the next set of results.
        public let nextToken: String?
        /// A list of your current resource data sync configurations and their statuses.
        public let resourceDataSyncItems: [ResourceDataSyncItem]?

        @inlinable
        public init(nextToken: String? = nil, resourceDataSyncItems: [ResourceDataSyncItem]? = nil) {
            self.nextToken = nextToken
            self.resourceDataSyncItems = resourceDataSyncItems
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case resourceDataSyncItems = "ResourceDataSyncItems"
        }
    }

    public struct ListTagsForResourceRequest: AWSEncodableShape {
        /// The resource ID for which you want to see a list of tags.
        public let resourceId: String
        /// Returns a list of tags for a specific resource type.
        public let resourceType: ResourceTypeForTagging

        @inlinable
        public init(resourceId: String, resourceType: ResourceTypeForTagging) {
            self.resourceId = resourceId
            self.resourceType = resourceType
        }

        private enum CodingKeys: String, CodingKey {
            case resourceId = "ResourceId"
            case resourceType = "ResourceType"
        }
    }

    public struct ListTagsForResourceResult: AWSDecodableShape {
        /// A list of tags.
        public let tagList: [Tag]?

        @inlinable
        public init(tagList: [Tag]? = nil) {
            self.tagList = tagList
        }

        private enum CodingKeys: String, CodingKey {
            case tagList = "TagList"
        }
    }

    public struct LoggingInfo: AWSEncodableShape & AWSDecodableShape {
        /// The name of an S3 bucket where execution logs are stored.
        public let s3BucketName: String
        /// (Optional) The S3 bucket subfolder.
        public let s3KeyPrefix: String?
        /// The Amazon Web Services Region where the S3 bucket is located.
        public let s3Region: String

        @inlinable
        public init(s3BucketName: String, s3KeyPrefix: String? = nil, s3Region: String) {
            self.s3BucketName = s3BucketName
            self.s3KeyPrefix = s3KeyPrefix
            self.s3Region = s3Region
        }

        public func validate(name: String) throws {
            try self.validate(self.s3BucketName, name: "s3BucketName", parent: name, max: 63)
            try self.validate(self.s3BucketName, name: "s3BucketName", parent: name, min: 3)
            try self.validate(self.s3KeyPrefix, name: "s3KeyPrefix", parent: name, max: 500)
            try self.validate(self.s3Region, name: "s3Region", parent: name, max: 20)
            try self.validate(self.s3Region, name: "s3Region", parent: name, min: 3)
        }

        private enum CodingKeys: String, CodingKey {
            case s3BucketName = "S3BucketName"
            case s3KeyPrefix = "S3KeyPrefix"
            case s3Region = "S3Region"
        }
    }

    public struct MaintenanceWindowAutomationParameters: AWSEncodableShape & AWSDecodableShape {
        /// The version of an Automation runbook to use during task execution.
        public let documentVersion: String?
        /// The parameters for the AUTOMATION task. For information about specifying and updating task parameters, see RegisterTaskWithMaintenanceWindow and UpdateMaintenanceWindowTask.   LoggingInfo has been deprecated. To specify an Amazon Simple Storage Service (Amazon S3) bucket to contain logs, instead use the OutputS3BucketName and OutputS3KeyPrefix options in the TaskInvocationParameters structure. For information about how Amazon Web Services Systems Manager handles these options for the supported maintenance window task types, see MaintenanceWindowTaskInvocationParameters.  TaskParameters has been deprecated. To specify parameters to pass to a task when it runs, instead use the Parameters option in the TaskInvocationParameters structure. For information about how Systems Manager handles these options for the supported maintenance window task types, see MaintenanceWindowTaskInvocationParameters. For AUTOMATION task types, Amazon Web Services Systems Manager ignores any values specified for these parameters.
        public let parameters: [String: [String]]?

        @inlinable
        public init(documentVersion: String? = nil, parameters: [String: [String]]? = nil) {
            self.documentVersion = documentVersion
            self.parameters = parameters
        }

        public func validate(name: String) throws {
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.parameters?.forEach {
                try validate($0.key, name: "parameters.key", parent: name, max: 50)
                try validate($0.key, name: "parameters.key", parent: name, min: 1)
                try validate($0.value, name: "parameters[\"\($0.key)\"]", parent: name, max: 50)
            }
            try self.validate(self.parameters, name: "parameters", parent: name, max: 200)
            try self.validate(self.parameters, name: "parameters", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case documentVersion = "DocumentVersion"
            case parameters = "Parameters"
        }
    }

    public struct MaintenanceWindowExecution: AWSDecodableShape {
        /// The time the execution finished.
        public let endTime: Date?
        /// The time the execution started.
        public let startTime: Date?
        /// The status of the execution.
        public let status: MaintenanceWindowExecutionStatus?
        /// The details explaining the status. Not available for all status values.
        public let statusDetails: String?
        /// The ID of the maintenance window execution.
        public let windowExecutionId: String?
        /// The ID of the maintenance window.
        public let windowId: String?

        @inlinable
        public init(endTime: Date? = nil, startTime: Date? = nil, status: MaintenanceWindowExecutionStatus? = nil, statusDetails: String? = nil, windowExecutionId: String? = nil, windowId: String? = nil) {
            self.endTime = endTime
            self.startTime = startTime
            self.status = status
            self.statusDetails = statusDetails
            self.windowExecutionId = windowExecutionId
            self.windowId = windowId
        }

        private enum CodingKeys: String, CodingKey {
            case endTime = "EndTime"
            case startTime = "StartTime"
            case status = "Status"
            case statusDetails = "StatusDetails"
            case windowExecutionId = "WindowExecutionId"
            case windowId = "WindowId"
        }
    }

    public struct MaintenanceWindowExecutionTaskIdentity: AWSDecodableShape {
        /// The details for the CloudWatch alarm applied to your maintenance window task.
        public let alarmConfiguration: AlarmConfiguration?
        /// The time the task execution finished.
        public let endTime: Date?
        /// The time the task execution started.
        public let startTime: Date?
        /// The status of the task execution.
        public let status: MaintenanceWindowExecutionStatus?
        /// The details explaining the status of the task execution. Not available for all status values.
        public let statusDetails: String?
        /// The Amazon Resource Name (ARN) of the task that ran.
        public let taskArn: String?
        /// The ID of the specific task execution in the maintenance window execution.
        public let taskExecutionId: String?
        /// The type of task that ran.
        public let taskType: MaintenanceWindowTaskType?
        /// The CloudWatch alarm that was invoked by the maintenance window task.
        public let triggeredAlarms: [AlarmStateInformation]?
        /// The ID of the maintenance window execution that ran the task.
        public let windowExecutionId: String?

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, endTime: Date? = nil, startTime: Date? = nil, status: MaintenanceWindowExecutionStatus? = nil, statusDetails: String? = nil, taskArn: String? = nil, taskExecutionId: String? = nil, taskType: MaintenanceWindowTaskType? = nil, triggeredAlarms: [AlarmStateInformation]? = nil, windowExecutionId: String? = nil) {
            self.alarmConfiguration = alarmConfiguration
            self.endTime = endTime
            self.startTime = startTime
            self.status = status
            self.statusDetails = statusDetails
            self.taskArn = taskArn
            self.taskExecutionId = taskExecutionId
            self.taskType = taskType
            self.triggeredAlarms = triggeredAlarms
            self.windowExecutionId = windowExecutionId
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case endTime = "EndTime"
            case startTime = "StartTime"
            case status = "Status"
            case statusDetails = "StatusDetails"
            case taskArn = "TaskArn"
            case taskExecutionId = "TaskExecutionId"
            case taskType = "TaskType"
            case triggeredAlarms = "TriggeredAlarms"
            case windowExecutionId = "WindowExecutionId"
        }
    }

    public struct MaintenanceWindowExecutionTaskInvocationIdentity: AWSDecodableShape {
        /// The time the invocation finished.
        public let endTime: Date?
        /// The ID of the action performed in the service that actually handled the task invocation. If the task type is RUN_COMMAND, this value is the command ID.
        public let executionId: String?
        /// The ID of the task invocation.
        public let invocationId: String?
        /// User-provided value that was specified when the target was registered with the maintenance window. This was also included in any Amazon CloudWatch Events events raised during the task invocation.
        public let ownerInformation: String?
        /// The parameters that were provided for the invocation when it was run.
        public let parameters: String?
        /// The time the invocation started.
        public let startTime: Date?
        /// The status of the task invocation.
        public let status: MaintenanceWindowExecutionStatus?
        /// The details explaining the status of the task invocation. Not available for all status values.
        public let statusDetails: String?
        /// The ID of the specific task execution in the maintenance window execution.
        public let taskExecutionId: String?
        /// The task type.
        public let taskType: MaintenanceWindowTaskType?
        /// The ID of the maintenance window execution that ran the task.
        public let windowExecutionId: String?
        /// The ID of the target definition in this maintenance window the invocation was performed for.
        public let windowTargetId: String?

        @inlinable
        public init(endTime: Date? = nil, executionId: String? = nil, invocationId: String? = nil, ownerInformation: String? = nil, parameters: String? = nil, startTime: Date? = nil, status: MaintenanceWindowExecutionStatus? = nil, statusDetails: String? = nil, taskExecutionId: String? = nil, taskType: MaintenanceWindowTaskType? = nil, windowExecutionId: String? = nil, windowTargetId: String? = nil) {
            self.endTime = endTime
            self.executionId = executionId
            self.invocationId = invocationId
            self.ownerInformation = ownerInformation
            self.parameters = parameters
            self.startTime = startTime
            self.status = status
            self.statusDetails = statusDetails
            self.taskExecutionId = taskExecutionId
            self.taskType = taskType
            self.windowExecutionId = windowExecutionId
            self.windowTargetId = windowTargetId
        }

        private enum CodingKeys: String, CodingKey {
            case endTime = "EndTime"
            case executionId = "ExecutionId"
            case invocationId = "InvocationId"
            case ownerInformation = "OwnerInformation"
            case parameters = "Parameters"
            case startTime = "StartTime"
            case status = "Status"
            case statusDetails = "StatusDetails"
            case taskExecutionId = "TaskExecutionId"
            case taskType = "TaskType"
            case windowExecutionId = "WindowExecutionId"
            case windowTargetId = "WindowTargetId"
        }
    }

    public struct MaintenanceWindowFilter: AWSEncodableShape {
        /// The name of the filter.
        public let key: String?
        /// The filter values.
        public let values: [String]?

        @inlinable
        public init(key: String? = nil, values: [String]? = nil) {
            self.key = key
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 128)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.values?.forEach {
                try validate($0, name: "values[]", parent: name, max: 256)
                try validate($0, name: "values[]", parent: name, min: 1)
            }
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case values = "Values"
        }
    }

    public struct MaintenanceWindowIdentity: AWSDecodableShape {
        /// The number of hours before the end of the maintenance window that Amazon Web Services Systems Manager stops scheduling new tasks for execution.
        public let cutoff: Int?
        /// A description of the maintenance window.
        public let description: String?
        /// The duration of the maintenance window in hours.
        public let duration: Int?
        /// Indicates whether the maintenance window is enabled.
        public let enabled: Bool?
        /// The date and time, in ISO-8601 Extended format, for when the maintenance window is scheduled to become inactive.
        public let endDate: String?
        /// The name of the maintenance window.
        public let name: String?
        /// The next time the maintenance window will actually run, taking into account any specified times for the maintenance window to become active or inactive.
        public let nextExecutionTime: String?
        /// The schedule of the maintenance window in the form of a cron or rate expression.
        public let schedule: String?
        /// The number of days to wait to run a maintenance window after the scheduled cron expression date and time.
        public let scheduleOffset: Int?
        /// The time zone that the scheduled maintenance window executions are based on, in Internet Assigned Numbers Authority (IANA) format.
        public let scheduleTimezone: String?
        /// The date and time, in ISO-8601 Extended format, for when the maintenance window is scheduled to become active.
        public let startDate: String?
        /// The ID of the maintenance window.
        public let windowId: String?

        @inlinable
        public init(cutoff: Int? = nil, description: String? = nil, duration: Int? = nil, enabled: Bool? = nil, endDate: String? = nil, name: String? = nil, nextExecutionTime: String? = nil, schedule: String? = nil, scheduleOffset: Int? = nil, scheduleTimezone: String? = nil, startDate: String? = nil, windowId: String? = nil) {
            self.cutoff = cutoff
            self.description = description
            self.duration = duration
            self.enabled = enabled
            self.endDate = endDate
            self.name = name
            self.nextExecutionTime = nextExecutionTime
            self.schedule = schedule
            self.scheduleOffset = scheduleOffset
            self.scheduleTimezone = scheduleTimezone
            self.startDate = startDate
            self.windowId = windowId
        }

        private enum CodingKeys: String, CodingKey {
            case cutoff = "Cutoff"
            case description = "Description"
            case duration = "Duration"
            case enabled = "Enabled"
            case endDate = "EndDate"
            case name = "Name"
            case nextExecutionTime = "NextExecutionTime"
            case schedule = "Schedule"
            case scheduleOffset = "ScheduleOffset"
            case scheduleTimezone = "ScheduleTimezone"
            case startDate = "StartDate"
            case windowId = "WindowId"
        }
    }

    public struct MaintenanceWindowIdentityForTarget: AWSDecodableShape {
        /// The name of the maintenance window.
        public let name: String?
        /// The ID of the maintenance window.
        public let windowId: String?

        @inlinable
        public init(name: String? = nil, windowId: String? = nil) {
            self.name = name
            self.windowId = windowId
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case windowId = "WindowId"
        }
    }

    public struct MaintenanceWindowLambdaParameters: AWSEncodableShape & AWSDecodableShape {
        /// Pass client-specific information to the Lambda function that you are invoking. You can then process the client information in your Lambda function as you choose through the context variable.
        public let clientContext: String?
        /// JSON to provide to your Lambda function as input.
        public let payload: AWSBase64Data?
        /// (Optional) Specify an Lambda function version or alias name. If you specify a function version, the operation uses the qualified function Amazon Resource Name (ARN) to invoke a specific Lambda function. If you specify an alias name, the operation uses the alias ARN to invoke the Lambda function version to which the alias points.
        public let qualifier: String?

        @inlinable
        public init(clientContext: String? = nil, payload: AWSBase64Data? = nil, qualifier: String? = nil) {
            self.clientContext = clientContext
            self.payload = payload
            self.qualifier = qualifier
        }

        public func validate(name: String) throws {
            try self.validate(self.clientContext, name: "clientContext", parent: name, max: 8000)
            try self.validate(self.clientContext, name: "clientContext", parent: name, min: 1)
            try self.validate(self.payload, name: "payload", parent: name, max: 4096)
            try self.validate(self.qualifier, name: "qualifier", parent: name, max: 128)
            try self.validate(self.qualifier, name: "qualifier", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case clientContext = "ClientContext"
            case payload = "Payload"
            case qualifier = "Qualifier"
        }
    }

    public struct MaintenanceWindowRunCommandParameters: AWSEncodableShape & AWSDecodableShape {
        public let cloudWatchOutputConfig: CloudWatchOutputConfig?
        /// Information about the commands to run.
        public let comment: String?
        /// The SHA-256 or SHA-1 hash created by the system when the document was created. SHA-1 hashes have been deprecated.
        public let documentHash: String?
        /// SHA-256 or SHA-1. SHA-1 hashes have been deprecated.
        public let documentHashType: DocumentHashType?
        /// The Amazon Web Services Systems Manager document (SSM document) version to use in the request. You can specify $DEFAULT, $LATEST, or a specific version number. If you run commands by using the Amazon Web Services CLI, then you must escape the first two options by using a backslash. If you specify a version number, then you don't need to use the backslash. For example:  --document-version "\$DEFAULT"   --document-version "\$LATEST"   --document-version "3"
        public let documentVersion: String?
        /// Configurations for sending notifications about command status changes on a per-managed node basis.
        public let notificationConfig: NotificationConfig?
        /// The name of the Amazon Simple Storage Service (Amazon S3) bucket.
        public let outputS3BucketName: String?
        /// The S3 bucket subfolder.
        public let outputS3KeyPrefix: String?
        /// The parameters for the RUN_COMMAND task execution.
        public let parameters: [String: [String]]?
        /// The Amazon Resource Name (ARN) of the IAM service role for Amazon Web Services Systems Manager to assume when running a maintenance window task. If you do not specify a service role ARN, Systems Manager uses a service-linked role in your account. If no appropriate service-linked role for Systems Manager exists in your account, it is created when you run RegisterTaskWithMaintenanceWindow. However, for an improved security posture, we strongly recommend creating a custom policy and custom service role for running your maintenance window tasks. The policy can be crafted to provide only the permissions needed for your particular maintenance window tasks. For more information, see Setting up Maintenance Windows in the in the Amazon Web Services Systems Manager User Guide.
        public let serviceRoleArn: String?
        /// If this time is reached and the command hasn't already started running, it doesn't run.
        public let timeoutSeconds: Int?

        @inlinable
        public init(cloudWatchOutputConfig: CloudWatchOutputConfig? = nil, comment: String? = nil, documentHash: String? = nil, documentHashType: DocumentHashType? = nil, documentVersion: String? = nil, notificationConfig: NotificationConfig? = nil, outputS3BucketName: String? = nil, outputS3KeyPrefix: String? = nil, parameters: [String: [String]]? = nil, serviceRoleArn: String? = nil, timeoutSeconds: Int? = nil) {
            self.cloudWatchOutputConfig = cloudWatchOutputConfig
            self.comment = comment
            self.documentHash = documentHash
            self.documentHashType = documentHashType
            self.documentVersion = documentVersion
            self.notificationConfig = notificationConfig
            self.outputS3BucketName = outputS3BucketName
            self.outputS3KeyPrefix = outputS3KeyPrefix
            self.parameters = parameters
            self.serviceRoleArn = serviceRoleArn
            self.timeoutSeconds = timeoutSeconds
        }

        public func validate(name: String) throws {
            try self.cloudWatchOutputConfig?.validate(name: "\(name).cloudWatchOutputConfig")
            try self.validate(self.comment, name: "comment", parent: name, max: 100)
            try self.validate(self.documentHash, name: "documentHash", parent: name, max: 256)
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.validate(self.outputS3BucketName, name: "outputS3BucketName", parent: name, max: 63)
            try self.validate(self.outputS3BucketName, name: "outputS3BucketName", parent: name, min: 3)
            try self.validate(self.outputS3KeyPrefix, name: "outputS3KeyPrefix", parent: name, max: 500)
            try self.validate(self.timeoutSeconds, name: "timeoutSeconds", parent: name, max: 2592000)
            try self.validate(self.timeoutSeconds, name: "timeoutSeconds", parent: name, min: 30)
        }

        private enum CodingKeys: String, CodingKey {
            case cloudWatchOutputConfig = "CloudWatchOutputConfig"
            case comment = "Comment"
            case documentHash = "DocumentHash"
            case documentHashType = "DocumentHashType"
            case documentVersion = "DocumentVersion"
            case notificationConfig = "NotificationConfig"
            case outputS3BucketName = "OutputS3BucketName"
            case outputS3KeyPrefix = "OutputS3KeyPrefix"
            case parameters = "Parameters"
            case serviceRoleArn = "ServiceRoleArn"
            case timeoutSeconds = "TimeoutSeconds"
        }
    }

    public struct MaintenanceWindowStepFunctionsParameters: AWSEncodableShape & AWSDecodableShape {
        /// The inputs for the STEP_FUNCTIONS task.
        public let input: String?
        /// The name of the STEP_FUNCTIONS task.
        public let name: String?

        @inlinable
        public init(input: String? = nil, name: String? = nil) {
            self.input = input
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.input, name: "input", parent: name, max: 4096)
            try self.validate(self.name, name: "name", parent: name, max: 80)
            try self.validate(self.name, name: "name", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case input = "Input"
            case name = "Name"
        }
    }

    public struct MaintenanceWindowTarget: AWSDecodableShape {
        /// A description for the target.
        public let description: String?
        /// The name for the maintenance window target.
        public let name: String?
        /// A user-provided value that will be included in any Amazon CloudWatch Events events that are raised while running tasks for these targets in this maintenance window.
        public let ownerInformation: String?
        /// The type of target that is being registered with the maintenance window.
        public let resourceType: MaintenanceWindowResourceType?
        /// The targets, either managed nodes or tags. Specify managed nodes using the following format:  Key=instanceids,Values=,  Tags are specified using the following format:  Key=,Values=.
        public let targets: [Target]?
        /// The ID of the maintenance window to register the target with.
        public let windowId: String?
        /// The ID of the target.
        public let windowTargetId: String?

        @inlinable
        public init(description: String? = nil, name: String? = nil, ownerInformation: String? = nil, resourceType: MaintenanceWindowResourceType? = nil, targets: [Target]? = nil, windowId: String? = nil, windowTargetId: String? = nil) {
            self.description = description
            self.name = name
            self.ownerInformation = ownerInformation
            self.resourceType = resourceType
            self.targets = targets
            self.windowId = windowId
            self.windowTargetId = windowTargetId
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case name = "Name"
            case ownerInformation = "OwnerInformation"
            case resourceType = "ResourceType"
            case targets = "Targets"
            case windowId = "WindowId"
            case windowTargetId = "WindowTargetId"
        }
    }

    public struct MaintenanceWindowTask: AWSDecodableShape {
        /// The details for the CloudWatch alarm applied to your maintenance window task.
        public let alarmConfiguration: AlarmConfiguration?
        /// The specification for whether tasks should continue to run after the cutoff time specified in the maintenance windows is reached.
        public let cutoffBehavior: MaintenanceWindowTaskCutoffBehavior?
        /// A description of the task.
        public let description: String?
        /// Information about an S3 bucket to write task-level logs to.   LoggingInfo has been deprecated. To specify an Amazon Simple Storage Service (Amazon S3) bucket to contain logs, instead use the OutputS3BucketName and OutputS3KeyPrefix options in the TaskInvocationParameters structure. For information about how Amazon Web Services Systems Manager handles these options for the supported maintenance window task types, see MaintenanceWindowTaskInvocationParameters.
        public let loggingInfo: LoggingInfo?
        /// The maximum number of targets this task can be run for, in parallel.  Although this element is listed as "Required: No", a value can be omitted only when you are registering or updating a targetless task You must provide a value in all other cases. For maintenance window tasks without a target specified, you can't supply a value for this option. Instead, the system inserts a placeholder value of 1. This value doesn't affect the running of your task.
        public let maxConcurrency: String?
        /// The maximum number of errors allowed before this task stops being scheduled.  Although this element is listed as "Required: No", a value can be omitted only when you are registering or updating a targetless task You must provide a value in all other cases. For maintenance window tasks without a target specified, you can't supply a value for this option. Instead, the system inserts a placeholder value of 1. This value doesn't affect the running of your task.
        public let maxErrors: String?
        /// The task name.
        public let name: String?
        /// The priority of the task in the maintenance window. The lower the number, the higher the priority. Tasks that have the same priority are scheduled in parallel.
        public let priority: Int?
        /// The Amazon Resource Name (ARN) of the IAM service role for Amazon Web Services Systems Manager to assume when running a maintenance window task. If you do not specify a service role ARN, Systems Manager uses a service-linked role in your account. If no appropriate service-linked role for Systems Manager exists in your account, it is created when you run RegisterTaskWithMaintenanceWindow. However, for an improved security posture, we strongly recommend creating a custom policy and custom service role for running your maintenance window tasks. The policy can be crafted to provide only the permissions needed for your particular maintenance window tasks. For more information, see Setting up Maintenance Windows in the in the Amazon Web Services Systems Manager User Guide.
        public let serviceRoleArn: String?
        /// The targets (either managed nodes or tags). Managed nodes are specified using Key=instanceids,Values=,. Tags are specified using Key=,Values=.
        public let targets: [Target]?
        /// The resource that the task uses during execution. For RUN_COMMAND and AUTOMATION task types, TaskArn is the Amazon Web Services Systems Manager (SSM document) name or ARN. For LAMBDA tasks, it's the function name or ARN. For STEP_FUNCTIONS tasks, it's the state machine ARN.
        public let taskArn: String?
        /// The parameters that should be passed to the task when it is run.   TaskParameters has been deprecated. To specify parameters to pass to a task when it runs, instead use the Parameters option in the TaskInvocationParameters structure. For information about how Systems Manager handles these options for the supported maintenance window task types, see MaintenanceWindowTaskInvocationParameters.
        public let taskParameters: [String: MaintenanceWindowTaskParameterValueExpression]?
        /// The type of task.
        public let type: MaintenanceWindowTaskType?
        /// The ID of the maintenance window where the task is registered.
        public let windowId: String?
        /// The task ID.
        public let windowTaskId: String?

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, cutoffBehavior: MaintenanceWindowTaskCutoffBehavior? = nil, description: String? = nil, loggingInfo: LoggingInfo? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, name: String? = nil, priority: Int? = nil, serviceRoleArn: String? = nil, targets: [Target]? = nil, taskArn: String? = nil, taskParameters: [String: MaintenanceWindowTaskParameterValueExpression]? = nil, type: MaintenanceWindowTaskType? = nil, windowId: String? = nil, windowTaskId: String? = nil) {
            self.alarmConfiguration = alarmConfiguration
            self.cutoffBehavior = cutoffBehavior
            self.description = description
            self.loggingInfo = loggingInfo
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.name = name
            self.priority = priority
            self.serviceRoleArn = serviceRoleArn
            self.targets = targets
            self.taskArn = taskArn
            self.taskParameters = taskParameters
            self.type = type
            self.windowId = windowId
            self.windowTaskId = windowTaskId
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case cutoffBehavior = "CutoffBehavior"
            case description = "Description"
            case loggingInfo = "LoggingInfo"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case name = "Name"
            case priority = "Priority"
            case serviceRoleArn = "ServiceRoleArn"
            case targets = "Targets"
            case taskArn = "TaskArn"
            case taskParameters = "TaskParameters"
            case type = "Type"
            case windowId = "WindowId"
            case windowTaskId = "WindowTaskId"
        }
    }

    public struct MaintenanceWindowTaskInvocationParameters: AWSEncodableShape & AWSDecodableShape {
        /// The parameters for an AUTOMATION task type.
        public let automation: MaintenanceWindowAutomationParameters?
        /// The parameters for a LAMBDA task type.
        public let lambda: MaintenanceWindowLambdaParameters?
        /// The parameters for a RUN_COMMAND task type.
        public let runCommand: MaintenanceWindowRunCommandParameters?
        /// The parameters for a STEP_FUNCTIONS task type.
        public let stepFunctions: MaintenanceWindowStepFunctionsParameters?

        @inlinable
        public init(automation: MaintenanceWindowAutomationParameters? = nil, lambda: MaintenanceWindowLambdaParameters? = nil, runCommand: MaintenanceWindowRunCommandParameters? = nil, stepFunctions: MaintenanceWindowStepFunctionsParameters? = nil) {
            self.automation = automation
            self.lambda = lambda
            self.runCommand = runCommand
            self.stepFunctions = stepFunctions
        }

        public func validate(name: String) throws {
            try self.automation?.validate(name: "\(name).automation")
            try self.lambda?.validate(name: "\(name).lambda")
            try self.runCommand?.validate(name: "\(name).runCommand")
            try self.stepFunctions?.validate(name: "\(name).stepFunctions")
        }

        private enum CodingKeys: String, CodingKey {
            case automation = "Automation"
            case lambda = "Lambda"
            case runCommand = "RunCommand"
            case stepFunctions = "StepFunctions"
        }
    }

    public struct MaintenanceWindowTaskParameterValueExpression: AWSEncodableShape & AWSDecodableShape {
        /// This field contains an array of 0 or more strings, each 1 to 255 characters in length.
        public let values: [String]?

        @inlinable
        public init(values: [String]? = nil) {
            self.values = values
        }

        public func validate(name: String) throws {
            try self.values?.forEach {
                try validate($0, name: "values[]", parent: name, max: 255)
                try validate($0, name: "values[]", parent: name, min: 1)
            }
        }

        private enum CodingKeys: String, CodingKey {
            case values = "Values"
        }
    }

    public struct MetadataValue: AWSEncodableShape & AWSDecodableShape {
        /// Metadata value to assign to an Application Manager application.
        public let value: String?

        @inlinable
        public init(value: String? = nil) {
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.value, name: "value", parent: name, max: 4096)
            try self.validate(self.value, name: "value", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case value = "Value"
        }
    }

    public struct ModifyDocumentPermissionRequest: AWSEncodableShape {
        /// The Amazon Web Services users that should have access to the document. The account IDs can either be a group of account IDs or All. You must specify a value for this parameter or the AccountIdsToRemove parameter.
        public let accountIdsToAdd: [String]?
        /// The Amazon Web Services users that should no longer have access to the document. The Amazon Web Services user can either be a group of account IDs or All. This action has a higher priority than AccountIdsToAdd. If you specify an ID to add and the same ID to remove, the system removes access to the document. You must specify a value for this parameter or the AccountIdsToAdd parameter.
        public let accountIdsToRemove: [String]?
        /// The name of the document that you want to share.
        public let name: String
        /// The permission type for the document. The permission type can be Share.
        public let permissionType: DocumentPermissionType
        /// (Optional) The version of the document to share. If it isn't specified, the system choose the Default version to share.
        public let sharedDocumentVersion: String?

        @inlinable
        public init(accountIdsToAdd: [String]? = nil, accountIdsToRemove: [String]? = nil, name: String, permissionType: DocumentPermissionType, sharedDocumentVersion: String? = nil) {
            self.accountIdsToAdd = accountIdsToAdd
            self.accountIdsToRemove = accountIdsToRemove
            self.name = name
            self.permissionType = permissionType
            self.sharedDocumentVersion = sharedDocumentVersion
        }

        public func validate(name: String) throws {
            try self.accountIdsToAdd?.forEach {
                try validate($0, name: "accountIdsToAdd[]", parent: name, pattern: "^(?i)all|[0-9]{12}$")
            }
            try self.validate(self.accountIdsToAdd, name: "accountIdsToAdd", parent: name, max: 20)
            try self.accountIdsToRemove?.forEach {
                try validate($0, name: "accountIdsToRemove[]", parent: name, pattern: "^(?i)all|[0-9]{12}$")
            }
            try self.validate(self.accountIdsToRemove, name: "accountIdsToRemove", parent: name, max: 20)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.validate(self.sharedDocumentVersion, name: "sharedDocumentVersion", parent: name, max: 8)
            try self.validate(self.sharedDocumentVersion, name: "sharedDocumentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|[$]ALL)$")
        }

        private enum CodingKeys: String, CodingKey {
            case accountIdsToAdd = "AccountIdsToAdd"
            case accountIdsToRemove = "AccountIdsToRemove"
            case name = "Name"
            case permissionType = "PermissionType"
            case sharedDocumentVersion = "SharedDocumentVersion"
        }
    }

    public struct ModifyDocumentPermissionResponse: AWSDecodableShape {
        public init() {}
    }

    public struct Node: AWSDecodableShape {
        /// The UTC timestamp for when the managed node data was last captured.
        public let captureTime: Date?
        /// The ID of the managed node.
        public let id: String?
        /// Information about the type of node.
        public let nodeType: NodeType?
        /// Information about the ownership of the managed node.
        public let owner: NodeOwnerInfo?
        /// The Amazon Web Services Region that a managed node was created in or assigned to.
        public let region: String?

        @inlinable
        public init(captureTime: Date? = nil, id: String? = nil, nodeType: NodeType? = nil, owner: NodeOwnerInfo? = nil, region: String? = nil) {
            self.captureTime = captureTime
            self.id = id
            self.nodeType = nodeType
            self.owner = owner
            self.region = region
        }

        private enum CodingKeys: String, CodingKey {
            case captureTime = "CaptureTime"
            case id = "Id"
            case nodeType = "NodeType"
            case owner = "Owner"
            case region = "Region"
        }
    }

    public struct NodeAggregator: AWSEncodableShape {
        /// Information about aggregators used to refine a node summary.
        public let aggregators: [NodeAggregator]?
        /// The aggregator type for limiting a node summary. Currently, only Count is supported.
        public let aggregatorType: NodeAggregatorType
        /// The name of a node attribute on which to limit the count of nodes.
        public let attributeName: NodeAttributeName
        /// The data type name to use for viewing counts of nodes. Currently, only Instance is supported.
        public let typeName: NodeTypeName

        @inlinable
        public init(aggregators: [NodeAggregator]? = nil, aggregatorType: NodeAggregatorType, attributeName: NodeAttributeName, typeName: NodeTypeName) {
            self.aggregators = aggregators
            self.aggregatorType = aggregatorType
            self.attributeName = attributeName
            self.typeName = typeName
        }

        public func validate(name: String) throws {
            try self.aggregators?.forEach {
                try $0.validate(name: "\(name).aggregators[]")
            }
            try self.validate(self.aggregators, name: "aggregators", parent: name, max: 2)
            try self.validate(self.aggregators, name: "aggregators", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case aggregators = "Aggregators"
            case aggregatorType = "AggregatorType"
            case attributeName = "AttributeName"
            case typeName = "TypeName"
        }
    }

    public struct NodeFilter: AWSEncodableShape {
        /// The name of the filter.
        public let key: NodeFilterKey
        /// The type of filter operator.
        public let type: NodeFilterOperatorType?
        /// A filter value supported by the specified key. For example, for the key PlatformType, supported values include Linux and Windows.
        public let values: [String]

        @inlinable
        public init(key: NodeFilterKey, type: NodeFilterOperatorType? = nil, values: [String]) {
            self.key = key
            self.type = type
            self.values = values
        }

        public func validate(name: String) throws {
            try self.values.forEach {
                try validate($0, name: "values[]", parent: name, max: 512)
                try validate($0, name: "values[]", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            }
            try self.validate(self.values, name: "values", parent: name, max: 5)
            try self.validate(self.values, name: "values", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case type = "Type"
            case values = "Values"
        }
    }

    public struct NodeOwnerInfo: AWSDecodableShape {
        /// The ID of the Amazon Web Services account that owns the managed node.
        public let accountId: String?
        /// The ID of the organization unit (OU) that the account is part of.
        public let organizationalUnitId: String?
        /// The path for the organizational unit (OU) that owns the managed node. The path for the OU is built using the IDs of the organization, root, and all OUs in the path down to and including the OU. For example:  o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-ghi0-awsccccc/ou-jkl0-awsddddd/
        public let organizationalUnitPath: String?

        @inlinable
        public init(accountId: String? = nil, organizationalUnitId: String? = nil, organizationalUnitPath: String? = nil) {
            self.accountId = accountId
            self.organizationalUnitId = organizationalUnitId
            self.organizationalUnitPath = organizationalUnitPath
        }

        private enum CodingKeys: String, CodingKey {
            case accountId = "AccountId"
            case organizationalUnitId = "OrganizationalUnitId"
            case organizationalUnitPath = "OrganizationalUnitPath"
        }
    }

    public struct NonCompliantSummary: AWSDecodableShape {
        /// The total number of compliance items that aren't compliant.
        public let nonCompliantCount: Int?
        /// A summary of the non-compliance severity by compliance type
        public let severitySummary: SeveritySummary?

        @inlinable
        public init(nonCompliantCount: Int? = nil, severitySummary: SeveritySummary? = nil) {
            self.nonCompliantCount = nonCompliantCount
            self.severitySummary = severitySummary
        }

        private enum CodingKeys: String, CodingKey {
            case nonCompliantCount = "NonCompliantCount"
            case severitySummary = "SeveritySummary"
        }
    }

    public struct NotificationConfig: AWSEncodableShape & AWSDecodableShape {
        /// An Amazon Resource Name (ARN) for an Amazon Simple Notification Service (Amazon SNS) topic. Run Command pushes notifications about command status changes to this topic.
        public let notificationArn: String?
        /// The different events for which you can receive notifications. To learn more about these events, see Monitoring Systems Manager status changes using Amazon SNS notifications in the Amazon Web Services Systems Manager User Guide.
        public let notificationEvents: [NotificationEvent]?
        /// The type of notification.    Command: Receive notification when the status of a command changes.    Invocation: For commands sent to multiple managed nodes, receive notification on a per-node basis when the status of a command changes.
        public let notificationType: NotificationType?

        @inlinable
        public init(notificationArn: String? = nil, notificationEvents: [NotificationEvent]? = nil, notificationType: NotificationType? = nil) {
            self.notificationArn = notificationArn
            self.notificationEvents = notificationEvents
            self.notificationType = notificationType
        }

        private enum CodingKeys: String, CodingKey {
            case notificationArn = "NotificationArn"
            case notificationEvents = "NotificationEvents"
            case notificationType = "NotificationType"
        }
    }

    public struct OpsAggregator: AWSEncodableShape {
        /// A nested aggregator for viewing counts of OpsData.
        public let aggregators: [OpsAggregator]?
        /// Either a Range or Count aggregator for limiting an OpsData summary.
        public let aggregatorType: String?
        /// The name of an OpsData attribute on which to limit the count of OpsData.
        public let attributeName: String?
        /// The aggregator filters.
        public let filters: [OpsFilter]?
        /// The data type name to use for viewing counts of OpsData.
        public let typeName: String?
        /// The aggregator value.
        public let values: [String: String]?

        @inlinable
        public init(aggregators: [OpsAggregator]? = nil, aggregatorType: String? = nil, attributeName: String? = nil, filters: [OpsFilter]? = nil, typeName: String? = nil, values: [String: String]? = nil) {
            self.aggregators = aggregators
            self.aggregatorType = aggregatorType
            self.attributeName = attributeName
            self.filters = filters
            self.typeName = typeName
            self.values = values
        }

        public func validate(name: String) throws {
            try self.aggregators?.forEach {
                try $0.validate(name: "\(name).aggregators[]")
            }
            try self.validate(self.aggregators, name: "aggregators", parent: name, max: 12)
            try self.validate(self.aggregators, name: "aggregators", parent: name, min: 1)
            try self.validate(self.aggregatorType, name: "aggregatorType", parent: name, max: 20)
            try self.validate(self.aggregatorType, name: "aggregatorType", parent: name, min: 1)
            try self.validate(self.aggregatorType, name: "aggregatorType", parent: name, pattern: "^(range|count|sum)$")
            try self.validate(self.attributeName, name: "attributeName", parent: name, max: 128)
            try self.validate(self.attributeName, name: "attributeName", parent: name, min: 1)
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.filters, name: "filters", parent: name, max: 5)
            try self.validate(self.filters, name: "filters", parent: name, min: 1)
            try self.validate(self.typeName, name: "typeName", parent: name, max: 100)
            try self.validate(self.typeName, name: "typeName", parent: name, min: 1)
            try self.validate(self.typeName, name: "typeName", parent: name, pattern: "^(AWS|Custom):.*$")
            try self.values?.forEach {
                try validate($0.key, name: "values.key", parent: name, max: 32)
                try validate($0.key, name: "values.key", parent: name, min: 1)
                try validate($0.value, name: "values[\"\($0.key)\"]", parent: name, max: 2048)
            }
            try self.validate(self.values, name: "values", parent: name, max: 5)
        }

        private enum CodingKeys: String, CodingKey {
            case aggregators = "Aggregators"
            case aggregatorType = "AggregatorType"
            case attributeName = "AttributeName"
            case filters = "Filters"
            case typeName = "TypeName"
            case values = "Values"
        }
    }

    public struct OpsEntity: AWSDecodableShape {
        /// The data returned by the query.
        public let data: [String: OpsEntityItem]?
        /// The query ID.
        public let id: String?

        @inlinable
        public init(data: [String: OpsEntityItem]? = nil, id: String? = nil) {
            self.data = data
            self.id = id
        }

        private enum CodingKeys: String, CodingKey {
            case data = "Data"
            case id = "Id"
        }
    }

    public struct OpsEntityItem: AWSDecodableShape {
        /// The time the OpsData was captured.
        public let captureTime: String?
        /// The details of an OpsData summary.
        public let content: [[String: String]]?

        @inlinable
        public init(captureTime: String? = nil, content: [[String: String]]? = nil) {
            self.captureTime = captureTime
            self.content = content
        }

        private enum CodingKeys: String, CodingKey {
            case captureTime = "CaptureTime"
            case content = "Content"
        }
    }

    public struct OpsFilter: AWSEncodableShape {
        /// The name of the filter.
        public let key: String
        /// The type of filter.
        public let type: OpsFilterOperatorType?
        /// The filter value.
        public let values: [String]

        @inlinable
        public init(key: String, type: OpsFilterOperatorType? = nil, values: [String]) {
            self.key = key
            self.type = type
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 200)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.values.forEach {
                try validate($0, name: "values[]", parent: name, max: 256)
            }
            try self.validate(self.values, name: "values", parent: name, max: 40)
            try self.validate(self.values, name: "values", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case type = "Type"
            case values = "Values"
        }
    }

    public struct OpsItem: AWSDecodableShape {
        /// The time a runbook workflow ended. Currently reported only for the OpsItem type /aws/changerequest.
        public let actualEndTime: Date?
        /// The time a runbook workflow started. Currently reported only for the OpsItem type /aws/changerequest.
        public let actualStartTime: Date?
        /// An OpsItem category. Category options include: Availability, Cost, Performance, Recovery, Security.
        public let category: String?
        /// The ARN of the Amazon Web Services account that created the OpsItem.
        public let createdBy: String?
        /// The date and time the OpsItem was created.
        public let createdTime: Date?
        /// The OpsItem description.
        public let description: String?
        /// The ARN of the Amazon Web Services account that last updated the OpsItem.
        public let lastModifiedBy: String?
        /// The date and time the OpsItem was last updated.
        public let lastModifiedTime: Date?
        /// The Amazon Resource Name (ARN) of an Amazon Simple Notification Service (Amazon SNS) topic where notifications are sent when this OpsItem is edited or changed.
        public let notifications: [OpsItemNotification]?
        /// Operational data is custom data that provides useful reference details about the OpsItem. For example, you can specify log files, error strings, license keys, troubleshooting tips, or other relevant data. You enter operational data as key-value pairs. The key has a maximum length of 128 characters. The value has a maximum size of 20 KB.  Operational data keys can't begin with the following: amazon, aws, amzn, ssm, /amazon, /aws, /amzn, /ssm.  You can choose to make the data searchable by other users in the account or you can restrict search access. Searchable data means that all users with access to the OpsItem Overview page (as provided by the DescribeOpsItems API operation) can view and search on the specified data. Operational data that isn't searchable is only viewable by users who have access to the OpsItem (as provided by the GetOpsItem API operation). Use the /aws/resources key in OperationalData to specify a related resource in the request. Use the /aws/automations key in OperationalData to associate an Automation runbook with the OpsItem. To view Amazon Web Services CLI example commands that use these keys, see Creating OpsItems manually in the Amazon Web Services Systems Manager User Guide.
        public let operationalData: [String: OpsItemDataValue]?
        /// The OpsItem Amazon Resource Name (ARN).
        public let opsItemArn: String?
        /// The ID of the OpsItem.
        public let opsItemId: String?
        /// The type of OpsItem. Systems Manager supports the following types of OpsItems:    /aws/issue  This type of OpsItem is used for default OpsItems created by OpsCenter.     /aws/changerequest  This type of OpsItem is used by Change Manager for reviewing and approving or rejecting change requests.     /aws/insight  This type of OpsItem is used by OpsCenter for aggregating and reporting on duplicate OpsItems.
        public let opsItemType: String?
        /// The time specified in a change request for a runbook workflow to end. Currently supported only for the OpsItem type /aws/changerequest.
        public let plannedEndTime: Date?
        /// The time specified in a change request for a runbook workflow to start. Currently supported only for the OpsItem type /aws/changerequest.
        public let plannedStartTime: Date?
        /// The importance of this OpsItem in relation to other OpsItems in the system.
        public let priority: Int?
        /// One or more OpsItems that share something in common with the current OpsItem. For example, related OpsItems can include OpsItems with similar error messages, impacted resources, or statuses for the impacted resource.
        public let relatedOpsItems: [RelatedOpsItem]?
        /// The severity of the OpsItem. Severity options range from 1 to 4.
        public let severity: String?
        /// The origin of the OpsItem, such as Amazon EC2 or Systems Manager. The impacted resource is a subset of source.
        public let source: String?
        /// The OpsItem status. For more information, see Editing OpsItem details in the Amazon Web Services Systems Manager User Guide.
        public let status: OpsItemStatus?
        /// A short heading that describes the nature of the OpsItem and the impacted resource.
        public let title: String?
        /// The version of this OpsItem. Each time the OpsItem is edited the version number increments by one.
        public let version: String?

        @inlinable
        public init(actualEndTime: Date? = nil, actualStartTime: Date? = nil, category: String? = nil, createdBy: String? = nil, createdTime: Date? = nil, description: String? = nil, lastModifiedBy: String? = nil, lastModifiedTime: Date? = nil, notifications: [OpsItemNotification]? = nil, operationalData: [String: OpsItemDataValue]? = nil, opsItemArn: String? = nil, opsItemId: String? = nil, opsItemType: String? = nil, plannedEndTime: Date? = nil, plannedStartTime: Date? = nil, priority: Int? = nil, relatedOpsItems: [RelatedOpsItem]? = nil, severity: String? = nil, source: String? = nil, status: OpsItemStatus? = nil, title: String? = nil, version: String? = nil) {
            self.actualEndTime = actualEndTime
            self.actualStartTime = actualStartTime
            self.category = category
            self.createdBy = createdBy
            self.createdTime = createdTime
            self.description = description
            self.lastModifiedBy = lastModifiedBy
            self.lastModifiedTime = lastModifiedTime
            self.notifications = notifications
            self.operationalData = operationalData
            self.opsItemArn = opsItemArn
            self.opsItemId = opsItemId
            self.opsItemType = opsItemType
            self.plannedEndTime = plannedEndTime
            self.plannedStartTime = plannedStartTime
            self.priority = priority
            self.relatedOpsItems = relatedOpsItems
            self.severity = severity
            self.source = source
            self.status = status
            self.title = title
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case actualEndTime = "ActualEndTime"
            case actualStartTime = "ActualStartTime"
            case category = "Category"
            case createdBy = "CreatedBy"
            case createdTime = "CreatedTime"
            case description = "Description"
            case lastModifiedBy = "LastModifiedBy"
            case lastModifiedTime = "LastModifiedTime"
            case notifications = "Notifications"
            case operationalData = "OperationalData"
            case opsItemArn = "OpsItemArn"
            case opsItemId = "OpsItemId"
            case opsItemType = "OpsItemType"
            case plannedEndTime = "PlannedEndTime"
            case plannedStartTime = "PlannedStartTime"
            case priority = "Priority"
            case relatedOpsItems = "RelatedOpsItems"
            case severity = "Severity"
            case source = "Source"
            case status = "Status"
            case title = "Title"
            case version = "Version"
        }
    }

    public struct OpsItemAlreadyExistsException: AWSErrorShape {
        public let message: String?
        public let opsItemId: String?

        @inlinable
        public init(message: String? = nil, opsItemId: String? = nil) {
            self.message = message
            self.opsItemId = opsItemId
        }

        private enum CodingKeys: String, CodingKey {
            case message = "Message"
            case opsItemId = "OpsItemId"
        }
    }

    public struct OpsItemDataValue: AWSEncodableShape & AWSDecodableShape {
        /// The type of key-value pair. Valid types include SearchableString and String.
        public let type: OpsItemDataType?
        /// The value of the OperationalData key.
        public let value: String?

        @inlinable
        public init(type: OpsItemDataType? = nil, value: String? = nil) {
            self.type = type
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.value, name: "value", parent: name, pattern: "^[\\s\\S]*\\S[\\s\\S]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case type = "Type"
            case value = "Value"
        }
    }

    public struct OpsItemEventFilter: AWSEncodableShape {
        /// The name of the filter key. Currently, the only supported value is OpsItemId.
        public let key: OpsItemEventFilterKey
        /// The operator used by the filter call. Currently, the only supported value is Equal.
        public let `operator`: OpsItemEventFilterOperator
        /// The values for the filter, consisting of one or more OpsItem IDs.
        public let values: [String]

        @inlinable
        public init(key: OpsItemEventFilterKey, operator: OpsItemEventFilterOperator, values: [String]) {
            self.key = key
            self.`operator` = `operator`
            self.values = values
        }

        public func validate(name: String) throws {
            try self.values.forEach {
                try validate($0, name: "values[]", parent: name, max: 15)
                try validate($0, name: "values[]", parent: name, min: 1)
                try validate($0, name: "values[]", parent: name, pattern: "^(oi)-[0-9a-f]{12}$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case `operator` = "Operator"
            case values = "Values"
        }
    }

    public struct OpsItemEventSummary: AWSDecodableShape {
        /// Information about the user or resource that created the OpsItem event.
        public let createdBy: OpsItemIdentity?
        /// The date and time the OpsItem event was created.
        public let createdTime: Date?
        /// Specific information about the OpsItem event.
        public let detail: String?
        /// The type of information provided as a detail.
        public let detailType: String?
        /// The ID of the OpsItem event.
        public let eventId: String?
        /// The ID of the OpsItem.
        public let opsItemId: String?
        /// The source of the OpsItem event.
        public let source: String?

        @inlinable
        public init(createdBy: OpsItemIdentity? = nil, createdTime: Date? = nil, detail: String? = nil, detailType: String? = nil, eventId: String? = nil, opsItemId: String? = nil, source: String? = nil) {
            self.createdBy = createdBy
            self.createdTime = createdTime
            self.detail = detail
            self.detailType = detailType
            self.eventId = eventId
            self.opsItemId = opsItemId
            self.source = source
        }

        private enum CodingKeys: String, CodingKey {
            case createdBy = "CreatedBy"
            case createdTime = "CreatedTime"
            case detail = "Detail"
            case detailType = "DetailType"
            case eventId = "EventId"
            case opsItemId = "OpsItemId"
            case source = "Source"
        }
    }

    public struct OpsItemFilter: AWSEncodableShape {
        /// The name of the filter.
        public let key: OpsItemFilterKey
        /// The operator used by the filter call.
        public let `operator`: OpsItemFilterOperator
        /// The filter value.
        public let values: [String]

        @inlinable
        public init(key: OpsItemFilterKey, operator: OpsItemFilterOperator, values: [String]) {
            self.key = key
            self.`operator` = `operator`
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case `operator` = "Operator"
            case values = "Values"
        }
    }

    public struct OpsItemIdentity: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the IAM entity that created the OpsItem event.
        public let arn: String?

        @inlinable
        public init(arn: String? = nil) {
            self.arn = arn
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "Arn"
        }
    }

    public struct OpsItemInvalidParameterException: AWSErrorShape {
        public let message: String?
        public let parameterNames: [String]?

        @inlinable
        public init(message: String? = nil, parameterNames: [String]? = nil) {
            self.message = message
            self.parameterNames = parameterNames
        }

        private enum CodingKeys: String, CodingKey {
            case message = "Message"
            case parameterNames = "ParameterNames"
        }
    }

    public struct OpsItemLimitExceededException: AWSErrorShape {
        public let limit: Int?
        public let limitType: String?
        public let message: String?
        public let resourceTypes: [String]?

        @inlinable
        public init(limit: Int? = nil, limitType: String? = nil, message: String? = nil, resourceTypes: [String]? = nil) {
            self.limit = limit
            self.limitType = limitType
            self.message = message
            self.resourceTypes = resourceTypes
        }

        private enum CodingKeys: String, CodingKey {
            case limit = "Limit"
            case limitType = "LimitType"
            case message = "Message"
            case resourceTypes = "ResourceTypes"
        }
    }

    public struct OpsItemNotification: AWSEncodableShape & AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of an Amazon Simple Notification Service (Amazon SNS) topic where notifications are sent when this OpsItem is edited or changed.
        public let arn: String?

        @inlinable
        public init(arn: String? = nil) {
            self.arn = arn
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "Arn"
        }
    }

    public struct OpsItemRelatedItemAlreadyExistsException: AWSErrorShape {
        public let message: String?
        public let opsItemId: String?
        public let resourceUri: String?

        @inlinable
        public init(message: String? = nil, opsItemId: String? = nil, resourceUri: String? = nil) {
            self.message = message
            self.opsItemId = opsItemId
            self.resourceUri = resourceUri
        }

        private enum CodingKeys: String, CodingKey {
            case message = "Message"
            case opsItemId = "OpsItemId"
            case resourceUri = "ResourceUri"
        }
    }

    public struct OpsItemRelatedItemSummary: AWSDecodableShape {
        /// The association ID.
        public let associationId: String?
        /// The association type.
        public let associationType: String?
        public let createdBy: OpsItemIdentity?
        /// The time the related-item association was created.
        public let createdTime: Date?
        public let lastModifiedBy: OpsItemIdentity?
        /// The time the related-item association was last updated.
        public let lastModifiedTime: Date?
        /// The OpsItem ID.
        public let opsItemId: String?
        /// The resource type.
        public let resourceType: String?
        /// The Amazon Resource Name (ARN) of the related-item resource.
        public let resourceUri: String?

        @inlinable
        public init(associationId: String? = nil, associationType: String? = nil, createdBy: OpsItemIdentity? = nil, createdTime: Date? = nil, lastModifiedBy: OpsItemIdentity? = nil, lastModifiedTime: Date? = nil, opsItemId: String? = nil, resourceType: String? = nil, resourceUri: String? = nil) {
            self.associationId = associationId
            self.associationType = associationType
            self.createdBy = createdBy
            self.createdTime = createdTime
            self.lastModifiedBy = lastModifiedBy
            self.lastModifiedTime = lastModifiedTime
            self.opsItemId = opsItemId
            self.resourceType = resourceType
            self.resourceUri = resourceUri
        }

        private enum CodingKeys: String, CodingKey {
            case associationId = "AssociationId"
            case associationType = "AssociationType"
            case createdBy = "CreatedBy"
            case createdTime = "CreatedTime"
            case lastModifiedBy = "LastModifiedBy"
            case lastModifiedTime = "LastModifiedTime"
            case opsItemId = "OpsItemId"
            case resourceType = "ResourceType"
            case resourceUri = "ResourceUri"
        }
    }

    public struct OpsItemRelatedItemsFilter: AWSEncodableShape {
        /// The name of the filter key. Supported values include ResourceUri, ResourceType, or AssociationId.
        public let key: OpsItemRelatedItemsFilterKey
        /// The operator used by the filter call. The only supported operator is EQUAL.
        public let `operator`: OpsItemRelatedItemsFilterOperator
        /// The values for the filter.
        public let values: [String]

        @inlinable
        public init(key: OpsItemRelatedItemsFilterKey, operator: OpsItemRelatedItemsFilterOperator, values: [String]) {
            self.key = key
            self.`operator` = `operator`
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case `operator` = "Operator"
            case values = "Values"
        }
    }

    public struct OpsItemSummary: AWSDecodableShape {
        /// The time a runbook workflow ended. Currently reported only for the OpsItem type /aws/changerequest.
        public let actualEndTime: Date?
        /// The time a runbook workflow started. Currently reported only for the OpsItem type /aws/changerequest.
        public let actualStartTime: Date?
        /// A list of OpsItems by category.
        public let category: String?
        /// The Amazon Resource Name (ARN) of the IAM entity that created the OpsItem.
        public let createdBy: String?
        /// The date and time the OpsItem was created.
        public let createdTime: Date?
        /// The Amazon Resource Name (ARN) of the IAM entity that created the OpsItem.
        public let lastModifiedBy: String?
        /// The date and time the OpsItem was last updated.
        public let lastModifiedTime: Date?
        /// Operational data is custom data that provides useful reference details about the OpsItem.
        public let operationalData: [String: OpsItemDataValue]?
        /// The ID of the OpsItem.
        public let opsItemId: String?
        /// The type of OpsItem. Systems Manager supports the following types of OpsItems:    /aws/issue  This type of OpsItem is used for default OpsItems created by OpsCenter.     /aws/changerequest  This type of OpsItem is used by Change Manager for reviewing and approving or rejecting change requests.     /aws/insight  This type of OpsItem is used by OpsCenter for aggregating and reporting on duplicate OpsItems.
        public let opsItemType: String?
        /// The time specified in a change request for a runbook workflow to end. Currently supported only for the OpsItem type /aws/changerequest.
        public let plannedEndTime: Date?
        /// The time specified in a change request for a runbook workflow to start. Currently supported only for the OpsItem type /aws/changerequest.
        public let plannedStartTime: Date?
        /// The importance of this OpsItem in relation to other OpsItems in the system.
        public let priority: Int?
        /// A list of OpsItems by severity.
        public let severity: String?
        /// The impacted Amazon Web Services resource.
        public let source: String?
        /// The OpsItem status.
        public let status: OpsItemStatus?
        /// A short heading that describes the nature of the OpsItem and the impacted resource.
        public let title: String?

        @inlinable
        public init(actualEndTime: Date? = nil, actualStartTime: Date? = nil, category: String? = nil, createdBy: String? = nil, createdTime: Date? = nil, lastModifiedBy: String? = nil, lastModifiedTime: Date? = nil, operationalData: [String: OpsItemDataValue]? = nil, opsItemId: String? = nil, opsItemType: String? = nil, plannedEndTime: Date? = nil, plannedStartTime: Date? = nil, priority: Int? = nil, severity: String? = nil, source: String? = nil, status: OpsItemStatus? = nil, title: String? = nil) {
            self.actualEndTime = actualEndTime
            self.actualStartTime = actualStartTime
            self.category = category
            self.createdBy = createdBy
            self.createdTime = createdTime
            self.lastModifiedBy = lastModifiedBy
            self.lastModifiedTime = lastModifiedTime
            self.operationalData = operationalData
            self.opsItemId = opsItemId
            self.opsItemType = opsItemType
            self.plannedEndTime = plannedEndTime
            self.plannedStartTime = plannedStartTime
            self.priority = priority
            self.severity = severity
            self.source = source
            self.status = status
            self.title = title
        }

        private enum CodingKeys: String, CodingKey {
            case actualEndTime = "ActualEndTime"
            case actualStartTime = "ActualStartTime"
            case category = "Category"
            case createdBy = "CreatedBy"
            case createdTime = "CreatedTime"
            case lastModifiedBy = "LastModifiedBy"
            case lastModifiedTime = "LastModifiedTime"
            case operationalData = "OperationalData"
            case opsItemId = "OpsItemId"
            case opsItemType = "OpsItemType"
            case plannedEndTime = "PlannedEndTime"
            case plannedStartTime = "PlannedStartTime"
            case priority = "Priority"
            case severity = "Severity"
            case source = "Source"
            case status = "Status"
            case title = "Title"
        }
    }

    public struct OpsMetadata: AWSDecodableShape {
        /// The date the OpsMetadata objects was created.
        public let creationDate: Date?
        /// The date the OpsMetadata object was last updated.
        public let lastModifiedDate: Date?
        /// The user name who last updated the OpsMetadata object.
        public let lastModifiedUser: String?
        /// The Amazon Resource Name (ARN) of the OpsMetadata Object or blob.
        public let opsMetadataArn: String?
        /// The ID of the Application Manager application.
        public let resourceId: String?

        @inlinable
        public init(creationDate: Date? = nil, lastModifiedDate: Date? = nil, lastModifiedUser: String? = nil, opsMetadataArn: String? = nil, resourceId: String? = nil) {
            self.creationDate = creationDate
            self.lastModifiedDate = lastModifiedDate
            self.lastModifiedUser = lastModifiedUser
            self.opsMetadataArn = opsMetadataArn
            self.resourceId = resourceId
        }

        private enum CodingKeys: String, CodingKey {
            case creationDate = "CreationDate"
            case lastModifiedDate = "LastModifiedDate"
            case lastModifiedUser = "LastModifiedUser"
            case opsMetadataArn = "OpsMetadataArn"
            case resourceId = "ResourceId"
        }
    }

    public struct OpsMetadataFilter: AWSEncodableShape {
        /// A filter key.
        public let key: String
        /// A filter value.
        public let values: [String]

        @inlinable
        public init(key: String, values: [String]) {
            self.key = key
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 128)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.validate(self.key, name: "key", parent: name, pattern: "^(?!\\s*$).+$")
            try self.values.forEach {
                try validate($0, name: "values[]", parent: name, max: 1024)
                try validate($0, name: "values[]", parent: name, min: 1)
            }
            try self.validate(self.values, name: "values", parent: name, max: 10)
            try self.validate(self.values, name: "values", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case values = "Values"
        }
    }

    public struct OpsResultAttribute: AWSEncodableShape {
        /// Name of the data type. Valid value: AWS:OpsItem, AWS:EC2InstanceInformation, AWS:OpsItemTrendline, or AWS:ComplianceSummary.
        public let typeName: String

        @inlinable
        public init(typeName: String) {
            self.typeName = typeName
        }

        public func validate(name: String) throws {
            try self.validate(self.typeName, name: "typeName", parent: name, max: 100)
            try self.validate(self.typeName, name: "typeName", parent: name, min: 1)
            try self.validate(self.typeName, name: "typeName", parent: name, pattern: "^(AWS|Custom):.*$")
        }

        private enum CodingKeys: String, CodingKey {
            case typeName = "TypeName"
        }
    }

    public struct OutputSource: AWSDecodableShape {
        /// The ID of the output source, for example the URL of an S3 bucket.
        public let outputSourceId: String?
        /// The type of source where the association execution details are stored, for example, Amazon S3.
        public let outputSourceType: String?

        @inlinable
        public init(outputSourceId: String? = nil, outputSourceType: String? = nil) {
            self.outputSourceId = outputSourceId
            self.outputSourceType = outputSourceType
        }

        private enum CodingKeys: String, CodingKey {
            case outputSourceId = "OutputSourceId"
            case outputSourceType = "OutputSourceType"
        }
    }

    public struct Parameter: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the parameter.
        public let arn: String?
        /// The data type of the parameter, such as text or aws:ec2:image. The default is text.
        public let dataType: String?
        /// Date the parameter was last changed or updated and the parameter version was created.
        public let lastModifiedDate: Date?
        /// The name of the parameter.
        public let name: String?
        /// Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats: parameter_name:version parameter_name:label
        public let selector: String?
        /// Applies to parameters that reference information in other Amazon Web Services services. SourceResult is the raw result or response from the source.
        public let sourceResult: String?
        /// The type of parameter. Valid values include the following: String, StringList, and SecureString.  If type is StringList, the system returns a comma-separated string with no spaces between commas in the Value field.
        public let type: ParameterType?
        /// The parameter value.  If type is StringList, the system returns a comma-separated string with no spaces between commas in the Value field.
        public let value: String?
        /// The parameter version.
        public let version: Int64?

        @inlinable
        public init(arn: String? = nil, dataType: String? = nil, lastModifiedDate: Date? = nil, name: String? = nil, selector: String? = nil, sourceResult: String? = nil, type: ParameterType? = nil, value: String? = nil, version: Int64? = nil) {
            self.arn = arn
            self.dataType = dataType
            self.lastModifiedDate = lastModifiedDate
            self.name = name
            self.selector = selector
            self.sourceResult = sourceResult
            self.type = type
            self.value = value
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "ARN"
            case dataType = "DataType"
            case lastModifiedDate = "LastModifiedDate"
            case name = "Name"
            case selector = "Selector"
            case sourceResult = "SourceResult"
            case type = "Type"
            case value = "Value"
            case version = "Version"
        }
    }

    public struct ParameterHistory: AWSDecodableShape {
        /// Parameter names can include the following letters and symbols. a-zA-Z0-9_.-
        public let allowedPattern: String?
        /// The data type of the parameter, such as text or aws:ec2:image. The default is text.
        public let dataType: String?
        /// Information about the parameter.
        public let description: String?
        /// The alias of the Key Management Service (KMS) key used to encrypt the parameter. Applies to SecureString parameters only
        public let keyId: String?
        /// Labels assigned to the parameter version.
        public let labels: [String]?
        /// Date the parameter was last changed or updated.
        public let lastModifiedDate: Date?
        /// Amazon Resource Name (ARN) of the Amazon Web Services user who last changed the parameter.
        public let lastModifiedUser: String?
        /// The name of the parameter.
        public let name: String?
        /// Information about the policies assigned to a parameter.  Assigning parameter policies in the Amazon Web Services Systems Manager User Guide.
        public let policies: [ParameterInlinePolicy]?
        /// The parameter tier.
        public let tier: ParameterTier?
        /// The type of parameter used.
        public let type: ParameterType?
        /// The parameter value.
        public let value: String?
        /// The parameter version.
        public let version: Int64?

        @inlinable
        public init(allowedPattern: String? = nil, dataType: String? = nil, description: String? = nil, keyId: String? = nil, labels: [String]? = nil, lastModifiedDate: Date? = nil, lastModifiedUser: String? = nil, name: String? = nil, policies: [ParameterInlinePolicy]? = nil, tier: ParameterTier? = nil, type: ParameterType? = nil, value: String? = nil, version: Int64? = nil) {
            self.allowedPattern = allowedPattern
            self.dataType = dataType
            self.description = description
            self.keyId = keyId
            self.labels = labels
            self.lastModifiedDate = lastModifiedDate
            self.lastModifiedUser = lastModifiedUser
            self.name = name
            self.policies = policies
            self.tier = tier
            self.type = type
            self.value = value
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case allowedPattern = "AllowedPattern"
            case dataType = "DataType"
            case description = "Description"
            case keyId = "KeyId"
            case labels = "Labels"
            case lastModifiedDate = "LastModifiedDate"
            case lastModifiedUser = "LastModifiedUser"
            case name = "Name"
            case policies = "Policies"
            case tier = "Tier"
            case type = "Type"
            case value = "Value"
            case version = "Version"
        }
    }

    public struct ParameterInlinePolicy: AWSDecodableShape {
        /// The status of the policy. Policies report the following statuses: Pending (the policy hasn't been enforced or applied yet), Finished (the policy was applied), Failed (the policy wasn't applied), or InProgress (the policy is being applied now).
        public let policyStatus: String?
        /// The JSON text of the policy.
        public let policyText: String?
        /// The type of policy. Parameter Store, a tool in Amazon Web Services Systems Manager, supports the following policy types: Expiration, ExpirationNotification, and NoChangeNotification.
        public let policyType: String?

        @inlinable
        public init(policyStatus: String? = nil, policyText: String? = nil, policyType: String? = nil) {
            self.policyStatus = policyStatus
            self.policyText = policyText
            self.policyType = policyType
        }

        private enum CodingKeys: String, CodingKey {
            case policyStatus = "PolicyStatus"
            case policyText = "PolicyText"
            case policyType = "PolicyType"
        }
    }

    public struct ParameterMetadata: AWSDecodableShape {
        /// A parameter name can include only the following letters and symbols. a-zA-Z0-9_.-
        public let allowedPattern: String?
        /// The Amazon Resource Name (ARN) of the parameter.
        public let arn: String?
        /// The data type of the parameter, such as text or aws:ec2:image. The default is text.
        public let dataType: String?
        /// Description of the parameter actions.
        public let description: String?
        /// The alias of the Key Management Service (KMS) key used to encrypt the parameter. Applies to SecureString parameters only.
        public let keyId: String?
        /// Date the parameter was last changed or updated.
        public let lastModifiedDate: Date?
        /// Amazon Resource Name (ARN) of the Amazon Web Services user who last changed the parameter.
        public let lastModifiedUser: String?
        /// The parameter name.
        public let name: String?
        /// A list of policies associated with a parameter.
        public let policies: [ParameterInlinePolicy]?
        /// The parameter tier.
        public let tier: ParameterTier?
        /// The type of parameter. Valid parameter types include the following: String, StringList, and SecureString.
        public let type: ParameterType?
        /// The parameter version.
        public let version: Int64?

        @inlinable
        public init(allowedPattern: String? = nil, arn: String? = nil, dataType: String? = nil, description: String? = nil, keyId: String? = nil, lastModifiedDate: Date? = nil, lastModifiedUser: String? = nil, name: String? = nil, policies: [ParameterInlinePolicy]? = nil, tier: ParameterTier? = nil, type: ParameterType? = nil, version: Int64? = nil) {
            self.allowedPattern = allowedPattern
            self.arn = arn
            self.dataType = dataType
            self.description = description
            self.keyId = keyId
            self.lastModifiedDate = lastModifiedDate
            self.lastModifiedUser = lastModifiedUser
            self.name = name
            self.policies = policies
            self.tier = tier
            self.type = type
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case allowedPattern = "AllowedPattern"
            case arn = "ARN"
            case dataType = "DataType"
            case description = "Description"
            case keyId = "KeyId"
            case lastModifiedDate = "LastModifiedDate"
            case lastModifiedUser = "LastModifiedUser"
            case name = "Name"
            case policies = "Policies"
            case tier = "Tier"
            case type = "Type"
            case version = "Version"
        }
    }

    public struct ParameterStringFilter: AWSEncodableShape {
        /// The name of the filter. The ParameterStringFilter object is used by the DescribeParameters and GetParametersByPath API operations. However, not all of the pattern values listed for Key can be used with both operations. For DescribeParameters, all of the listed patterns are valid except Label. For GetParametersByPath, the following patterns listed for Key aren't valid: tag, DataType, Name, Path, and Tier. For examples of Amazon Web Services CLI commands demonstrating valid parameter filter constructions, see Searching for Systems Manager parameters in the Amazon Web Services Systems Manager User Guide.
        public let key: String
        /// For all filters used with DescribeParameters, valid options include Equals and BeginsWith. The Name filter additionally supports the Contains option. (Exception: For filters using the key Path, valid options include Recursive and OneLevel.) For filters used with GetParametersByPath, valid options include Equals and BeginsWith. (Exception: For filters using Label as the Key name, the only valid option is Equals.)
        public let option: String?
        /// The value you want to search for.
        public let values: [String]?

        @inlinable
        public init(key: String, option: String? = nil, values: [String]? = nil) {
            self.key = key
            self.option = option
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 132)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.validate(self.key, name: "key", parent: name, pattern: "^tag:.+|Name|Type|KeyId|Path|Label|Tier|DataType$")
            try self.validate(self.option, name: "option", parent: name, max: 10)
            try self.validate(self.option, name: "option", parent: name, min: 1)
            try self.values?.forEach {
                try validate($0, name: "values[]", parent: name, max: 1024)
                try validate($0, name: "values[]", parent: name, min: 1)
            }
            try self.validate(self.values, name: "values", parent: name, max: 50)
            try self.validate(self.values, name: "values", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case option = "Option"
            case values = "Values"
        }
    }

    public struct ParametersFilter: AWSEncodableShape {
        /// The name of the filter.
        public let key: ParametersFilterKey
        /// The filter values.
        public let values: [String]

        @inlinable
        public init(key: ParametersFilterKey, values: [String]) {
            self.key = key
            self.values = values
        }

        public func validate(name: String) throws {
            try self.values.forEach {
                try validate($0, name: "values[]", parent: name, max: 1024)
                try validate($0, name: "values[]", parent: name, min: 1)
            }
            try self.validate(self.values, name: "values", parent: name, max: 50)
            try self.validate(self.values, name: "values", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case values = "Values"
        }
    }

    public struct ParentStepDetails: AWSDecodableShape {
        /// The name of the automation action.
        public let action: String?
        /// The current repetition of the loop represented by an integer.
        public let iteration: Int?
        /// The current value of the specified iterator in the loop.
        public let iteratorValue: String?
        /// The unique ID of a step execution.
        public let stepExecutionId: String?
        /// The name of the step.
        public let stepName: String?

        @inlinable
        public init(action: String? = nil, iteration: Int? = nil, iteratorValue: String? = nil, stepExecutionId: String? = nil, stepName: String? = nil) {
            self.action = action
            self.iteration = iteration
            self.iteratorValue = iteratorValue
            self.stepExecutionId = stepExecutionId
            self.stepName = stepName
        }

        private enum CodingKeys: String, CodingKey {
            case action = "Action"
            case iteration = "Iteration"
            case iteratorValue = "IteratorValue"
            case stepExecutionId = "StepExecutionId"
            case stepName = "StepName"
        }
    }

    public struct Patch: AWSDecodableShape {
        /// The Advisory ID of the patch. For example, RHSA-2020:3779. Applies to Linux-based managed nodes only.
        public let advisoryIds: [String]?
        /// The architecture of the patch. For example, in example-pkg-0.710.10-2.7.abcd.x86_64, the architecture is indicated by x86_64. Applies to Linux-based managed nodes only.
        public let arch: String?
        /// The Bugzilla ID of the patch. For example, 1600646. Applies to Linux-based managed nodes only.
        public let bugzillaIds: [String]?
        /// The classification of the patch. For example, SecurityUpdates, Updates, or CriticalUpdates.
        public let classification: String?
        /// The URL where more information can be obtained about the patch.
        public let contentUrl: String?
        /// The Common Vulnerabilities and Exposures (CVE) ID of the patch. For example, CVE-2011-3192. Applies to Linux-based managed nodes only.
        public let cveIds: [String]?
        /// The description of the patch.
        public let description: String?
        /// The epoch of the patch. For example in pkg-example-EE-20180914-2.2.amzn1.noarch, the epoch value is 20180914-2. Applies to Linux-based managed nodes only.
        public let epoch: Int?
        /// The ID of the patch. Applies to Windows patches only.  This ID isn't the same as the Microsoft Knowledge Base ID.
        public let id: String?
        /// The Microsoft Knowledge Base ID of the patch. Applies to Windows patches only.
        public let kbNumber: String?
        /// The language of the patch if it's language-specific.
        public let language: String?
        /// The ID of the Microsoft Security Response Center (MSRC) bulletin the patch is related to. For example, MS14-045. Applies to Windows patches only.
        public let msrcNumber: String?
        /// The severity of the patch, such as Critical, Important, or Moderate. Applies to Windows patches only.
        public let msrcSeverity: String?
        /// The name of the patch. Applies to Linux-based managed nodes only.
        public let name: String?
        /// The specific product the patch is applicable for. For example, WindowsServer2016 or AmazonLinux2018.03.
        public let product: String?
        /// The product family the patch is applicable for. For example, Windows or Amazon Linux 2.
        public let productFamily: String?
        /// The particular release of a patch. For example, in pkg-example-EE-20180914-2.2.amzn1.noarch, the release is 2.amaz1. Applies to Linux-based managed nodes only.
        public let release: String?
        /// The date the patch was released.
        public let releaseDate: Date?
        /// The source patch repository for the operating system and version, such as trusty-security for Ubuntu Server 14.04 LTE and focal-security for Ubuntu Server 20.04 LTE. Applies to Linux-based managed nodes only.
        public let repository: String?
        /// The severity level of the patch. For example, CRITICAL or MODERATE.
        public let severity: String?
        /// The title of the patch.
        public let title: String?
        /// The name of the vendor providing the patch.
        public let vendor: String?
        /// The version number of the patch. For example, in example-pkg-1.710.10-2.7.abcd.x86_64, the version number is indicated by -1. Applies to Linux-based managed nodes only.
        public let version: String?

        @inlinable
        public init(advisoryIds: [String]? = nil, arch: String? = nil, bugzillaIds: [String]? = nil, classification: String? = nil, contentUrl: String? = nil, cveIds: [String]? = nil, description: String? = nil, epoch: Int? = nil, id: String? = nil, kbNumber: String? = nil, language: String? = nil, msrcNumber: String? = nil, msrcSeverity: String? = nil, name: String? = nil, product: String? = nil, productFamily: String? = nil, release: String? = nil, releaseDate: Date? = nil, repository: String? = nil, severity: String? = nil, title: String? = nil, vendor: String? = nil, version: String? = nil) {
            self.advisoryIds = advisoryIds
            self.arch = arch
            self.bugzillaIds = bugzillaIds
            self.classification = classification
            self.contentUrl = contentUrl
            self.cveIds = cveIds
            self.description = description
            self.epoch = epoch
            self.id = id
            self.kbNumber = kbNumber
            self.language = language
            self.msrcNumber = msrcNumber
            self.msrcSeverity = msrcSeverity
            self.name = name
            self.product = product
            self.productFamily = productFamily
            self.release = release
            self.releaseDate = releaseDate
            self.repository = repository
            self.severity = severity
            self.title = title
            self.vendor = vendor
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case advisoryIds = "AdvisoryIds"
            case arch = "Arch"
            case bugzillaIds = "BugzillaIds"
            case classification = "Classification"
            case contentUrl = "ContentUrl"
            case cveIds = "CVEIds"
            case description = "Description"
            case epoch = "Epoch"
            case id = "Id"
            case kbNumber = "KbNumber"
            case language = "Language"
            case msrcNumber = "MsrcNumber"
            case msrcSeverity = "MsrcSeverity"
            case name = "Name"
            case product = "Product"
            case productFamily = "ProductFamily"
            case release = "Release"
            case releaseDate = "ReleaseDate"
            case repository = "Repository"
            case severity = "Severity"
            case title = "Title"
            case vendor = "Vendor"
            case version = "Version"
        }
    }

    public struct PatchBaselineIdentity: AWSDecodableShape {
        /// The description of the patch baseline.
        public let baselineDescription: String?
        /// The ID of the patch baseline.
        public let baselineId: String?
        /// The name of the patch baseline.
        public let baselineName: String?
        /// Indicates whether this is the default baseline. Amazon Web Services Systems Manager supports creating multiple default patch baselines. For example, you can create a default patch baseline for each operating system.
        public let defaultBaseline: Bool?
        /// Defines the operating system the patch baseline applies to. The default value is WINDOWS.
        public let operatingSystem: OperatingSystem?

        @inlinable
        public init(baselineDescription: String? = nil, baselineId: String? = nil, baselineName: String? = nil, defaultBaseline: Bool? = nil, operatingSystem: OperatingSystem? = nil) {
            self.baselineDescription = baselineDescription
            self.baselineId = baselineId
            self.baselineName = baselineName
            self.defaultBaseline = defaultBaseline
            self.operatingSystem = operatingSystem
        }

        private enum CodingKeys: String, CodingKey {
            case baselineDescription = "BaselineDescription"
            case baselineId = "BaselineId"
            case baselineName = "BaselineName"
            case defaultBaseline = "DefaultBaseline"
            case operatingSystem = "OperatingSystem"
        }
    }

    public struct PatchComplianceData: AWSDecodableShape {
        /// The classification of the patch, such as SecurityUpdates, Updates, and CriticalUpdates.
        public let classification: String
        /// The IDs of one or more Common Vulnerabilities and Exposure (CVE) issues that are resolved by the patch.  Currently, CVE ID values are reported only for patches with a status of Missing or Failed.
        public let cveIds: String?
        /// The date/time the patch was installed on the managed node. Not all operating systems provide this level of information.
        public let installedTime: Date
        /// The operating system-specific ID of the patch.
        public let kbId: String
        /// The severity of the patch such as Critical, Important, and Moderate.
        public let severity: String
        /// The state of the patch on the managed node, such as INSTALLED or FAILED. For descriptions of each patch state, see About patch compliance in the Amazon Web Services Systems Manager User Guide.
        public let state: PatchComplianceDataState
        /// The title of the patch.
        public let title: String

        @inlinable
        public init(classification: String, cveIds: String? = nil, installedTime: Date, kbId: String, severity: String, state: PatchComplianceDataState, title: String) {
            self.classification = classification
            self.cveIds = cveIds
            self.installedTime = installedTime
            self.kbId = kbId
            self.severity = severity
            self.state = state
            self.title = title
        }

        private enum CodingKeys: String, CodingKey {
            case classification = "Classification"
            case cveIds = "CVEIds"
            case installedTime = "InstalledTime"
            case kbId = "KBId"
            case severity = "Severity"
            case state = "State"
            case title = "Title"
        }
    }

    public struct PatchFilter: AWSEncodableShape & AWSDecodableShape {
        /// The key for the filter. Run the DescribePatchProperties command to view lists of valid keys for each operating system type.
        public let key: PatchFilterKey
        /// The value for the filter key. Run the DescribePatchProperties command to view lists of valid values for each key based on operating system type.
        public let values: [String]

        @inlinable
        public init(key: PatchFilterKey, values: [String]) {
            self.key = key
            self.values = values
        }

        public func validate(name: String) throws {
            try self.values.forEach {
                try validate($0, name: "values[]", parent: name, max: 64)
                try validate($0, name: "values[]", parent: name, min: 1)
            }
            try self.validate(self.values, name: "values", parent: name, max: 20)
            try self.validate(self.values, name: "values", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case values = "Values"
        }
    }

    public struct PatchFilterGroup: AWSEncodableShape & AWSDecodableShape {
        /// The set of patch filters that make up the group.
        public let patchFilters: [PatchFilter]

        @inlinable
        public init(patchFilters: [PatchFilter]) {
            self.patchFilters = patchFilters
        }

        public func validate(name: String) throws {
            try self.patchFilters.forEach {
                try $0.validate(name: "\(name).patchFilters[]")
            }
            try self.validate(self.patchFilters, name: "patchFilters", parent: name, max: 4)
        }

        private enum CodingKeys: String, CodingKey {
            case patchFilters = "PatchFilters"
        }
    }

    public struct PatchGroupPatchBaselineMapping: AWSDecodableShape {
        /// The patch baseline the patch group is registered with.
        public let baselineIdentity: PatchBaselineIdentity?
        /// The name of the patch group registered with the patch baseline.
        public let patchGroup: String?

        @inlinable
        public init(baselineIdentity: PatchBaselineIdentity? = nil, patchGroup: String? = nil) {
            self.baselineIdentity = baselineIdentity
            self.patchGroup = patchGroup
        }

        private enum CodingKeys: String, CodingKey {
            case baselineIdentity = "BaselineIdentity"
            case patchGroup = "PatchGroup"
        }
    }

    public struct PatchOrchestratorFilter: AWSEncodableShape {
        /// The key for the filter.
        public let key: String?
        /// The value for the filter.
        public let values: [String]?

        @inlinable
        public init(key: String? = nil, values: [String]? = nil) {
            self.key = key
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 128)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.values?.forEach {
                try validate($0, name: "values[]", parent: name, max: 256)
                try validate($0, name: "values[]", parent: name, min: 1)
            }
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case values = "Values"
        }
    }

    public struct PatchRule: AWSEncodableShape & AWSDecodableShape {
        /// The number of days after the release date of each patch matched by the rule that the patch is marked as approved in the patch baseline. For example, a value of 7 means that patches are approved seven days after they are released. This parameter is marked as Required: No, but your request must include a value for either ApproveAfterDays or ApproveUntilDate. Not supported for Debian Server or Ubuntu Server.  Use caution when setting this value for Windows Server patch baselines. Because patch updates that are replaced by later updates are removed, setting too broad a value for this parameter can result in crucial patches not being installed. For more information, see the Windows Server tab in the topic How security patches are selected in the Amazon Web Services Systems Manager User Guide.
        public let approveAfterDays: Int?
        /// The cutoff date for auto approval of released patches. Any patches released on or before this date are installed automatically. Enter dates in the format YYYY-MM-DD. For example, 2024-12-31. This parameter is marked as Required: No, but your request must include a value for either ApproveUntilDate or ApproveAfterDays. Not supported for Debian Server or Ubuntu Server.  Use caution when setting this value for Windows Server patch baselines. Because patch updates that are replaced by later updates are removed, setting too broad a value for this parameter can result in crucial patches not being installed. For more information, see the Windows Server tab in the topic How security patches are selected in the Amazon Web Services Systems Manager User Guide.
        public let approveUntilDate: String?
        /// A compliance severity level for all approved patches in a patch baseline.
        public let complianceLevel: PatchComplianceLevel?
        /// For managed nodes identified by the approval rule filters, enables a patch baseline to apply non-security updates available in the specified repository. The default value is false. Applies to Linux managed nodes only.
        public let enableNonSecurity: Bool?
        /// The patch filter group that defines the criteria for the rule.
        public let patchFilterGroup: PatchFilterGroup

        @inlinable
        public init(approveAfterDays: Int? = nil, approveUntilDate: String? = nil, complianceLevel: PatchComplianceLevel? = nil, enableNonSecurity: Bool? = nil, patchFilterGroup: PatchFilterGroup) {
            self.approveAfterDays = approveAfterDays
            self.approveUntilDate = approveUntilDate
            self.complianceLevel = complianceLevel
            self.enableNonSecurity = enableNonSecurity
            self.patchFilterGroup = patchFilterGroup
        }

        public func validate(name: String) throws {
            try self.validate(self.approveAfterDays, name: "approveAfterDays", parent: name, max: 360)
            try self.validate(self.approveAfterDays, name: "approveAfterDays", parent: name, min: 0)
            try self.validate(self.approveUntilDate, name: "approveUntilDate", parent: name, max: 10)
            try self.validate(self.approveUntilDate, name: "approveUntilDate", parent: name, min: 1)
            try self.patchFilterGroup.validate(name: "\(name).patchFilterGroup")
        }

        private enum CodingKeys: String, CodingKey {
            case approveAfterDays = "ApproveAfterDays"
            case approveUntilDate = "ApproveUntilDate"
            case complianceLevel = "ComplianceLevel"
            case enableNonSecurity = "EnableNonSecurity"
            case patchFilterGroup = "PatchFilterGroup"
        }
    }

    public struct PatchRuleGroup: AWSEncodableShape & AWSDecodableShape {
        /// The rules that make up the rule group.
        public let patchRules: [PatchRule]

        @inlinable
        public init(patchRules: [PatchRule]) {
            self.patchRules = patchRules
        }

        public func validate(name: String) throws {
            try self.patchRules.forEach {
                try $0.validate(name: "\(name).patchRules[]")
            }
            try self.validate(self.patchRules, name: "patchRules", parent: name, max: 10)
        }

        private enum CodingKeys: String, CodingKey {
            case patchRules = "PatchRules"
        }
    }

    public struct PatchSource: AWSEncodableShape & AWSDecodableShape {
        /// The value of the repo configuration.  Example for yum repositories   [main]   name=MyCustomRepository   baseurl=https://my-custom-repository   enabled=1  For information about other options available for your yum repository configuration, see dnf.conf(5) on the man7.org website.  Examples for Ubuntu Server and Debian Server   deb http://security.ubuntu.com/ubuntu jammy main   deb https://site.example.com/debian distribution component1 component2 component3  Repo information for Ubuntu Server repositories must be specifed in a single line. For more examples and information, see jammy (5) sources.list.5.gz on the Ubuntu Server Manuals website and sources.list format on the Debian Wiki.
        public let configuration: String
        /// The name specified to identify the patch source.
        public let name: String
        /// The specific operating system versions a patch repository applies to, such as "Ubuntu16.04", "AmazonLinux2016.09", "RedhatEnterpriseLinux7.2" or "Suse12.7". For lists of supported product values, see PatchFilter.
        public let products: [String]

        @inlinable
        public init(configuration: String, name: String, products: [String]) {
            self.configuration = configuration
            self.name = name
            self.products = products
        }

        public func validate(name: String) throws {
            try self.validate(self.configuration, name: "configuration", parent: name, max: 1024)
            try self.validate(self.configuration, name: "configuration", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,50}$")
            try self.products.forEach {
                try validate($0, name: "products[]", parent: name, max: 128)
                try validate($0, name: "products[]", parent: name, min: 1)
            }
            try self.validate(self.products, name: "products", parent: name, max: 20)
            try self.validate(self.products, name: "products", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case configuration = "Configuration"
            case name = "Name"
            case products = "Products"
        }
    }

    public struct PatchStatus: AWSDecodableShape {
        /// The date the patch was approved (or will be approved if the status is PENDING_APPROVAL).
        public let approvalDate: Date?
        /// The compliance severity level for a patch.
        public let complianceLevel: PatchComplianceLevel?
        /// The approval status of a patch.
        public let deploymentStatus: PatchDeploymentStatus?

        @inlinable
        public init(approvalDate: Date? = nil, complianceLevel: PatchComplianceLevel? = nil, deploymentStatus: PatchDeploymentStatus? = nil) {
            self.approvalDate = approvalDate
            self.complianceLevel = complianceLevel
            self.deploymentStatus = deploymentStatus
        }

        private enum CodingKeys: String, CodingKey {
            case approvalDate = "ApprovalDate"
            case complianceLevel = "ComplianceLevel"
            case deploymentStatus = "DeploymentStatus"
        }
    }

    public struct ProgressCounters: AWSDecodableShape {
        /// The total number of steps that the system cancelled in all specified Amazon Web Services Regions and Amazon Web Services accounts for the current Automation execution.
        public let cancelledSteps: Int?
        /// The total number of steps that failed to run in all specified Amazon Web Services Regions and Amazon Web Services accounts for the current Automation execution.
        public let failedSteps: Int?
        /// The total number of steps that successfully completed in all specified Amazon Web Services Regions and Amazon Web Services accounts for the current Automation execution.
        public let successSteps: Int?
        /// The total number of steps that timed out in all specified Amazon Web Services Regions and Amazon Web Services accounts for the current Automation execution.
        public let timedOutSteps: Int?
        /// The total number of steps run in all specified Amazon Web Services Regions and Amazon Web Services accounts for the current Automation execution.
        public let totalSteps: Int?

        @inlinable
        public init(cancelledSteps: Int? = nil, failedSteps: Int? = nil, successSteps: Int? = nil, timedOutSteps: Int? = nil, totalSteps: Int? = nil) {
            self.cancelledSteps = cancelledSteps
            self.failedSteps = failedSteps
            self.successSteps = successSteps
            self.timedOutSteps = timedOutSteps
            self.totalSteps = totalSteps
        }

        private enum CodingKeys: String, CodingKey {
            case cancelledSteps = "CancelledSteps"
            case failedSteps = "FailedSteps"
            case successSteps = "SuccessSteps"
            case timedOutSteps = "TimedOutSteps"
            case totalSteps = "TotalSteps"
        }
    }

    public struct PutComplianceItemsRequest: AWSEncodableShape {
        /// Specify the compliance type. For example, specify Association (for a State Manager association), Patch, or Custom:string.
        public let complianceType: String
        /// A summary of the call execution that includes an execution ID, the type of execution (for example, Command), and the date/time of the execution using a datetime object that is saved in the following format: yyyy-MM-dd'T'HH:mm:ss'Z'
        public let executionSummary: ComplianceExecutionSummary
        /// MD5 or SHA-256 content hash. The content hash is used to determine if existing information should be overwritten or ignored. If the content hashes match, the request to put compliance information is ignored.
        public let itemContentHash: String?
        /// Information about the compliance as defined by the resource type. For example, for a patch compliance type, Items includes information about the PatchSeverity, Classification, and so on.
        public let items: [ComplianceItemEntry]
        /// Specify an ID for this resource. For a managed node, this is the node ID.
        public let resourceId: String
        /// Specify the type of resource. ManagedInstance is currently the only supported resource type.
        public let resourceType: String
        /// The mode for uploading compliance items. You can specify COMPLETE or PARTIAL. In COMPLETE mode, the system overwrites all existing compliance information for the resource. You must provide a full list of compliance items each time you send the request. In PARTIAL mode, the system overwrites compliance information for a specific association. The association must be configured with SyncCompliance set to MANUAL. By default, all requests use COMPLETE mode.  This attribute is only valid for association compliance.
        public let uploadType: ComplianceUploadType?

        @inlinable
        public init(complianceType: String, executionSummary: ComplianceExecutionSummary, itemContentHash: String? = nil, items: [ComplianceItemEntry], resourceId: String, resourceType: String, uploadType: ComplianceUploadType? = nil) {
            self.complianceType = complianceType
            self.executionSummary = executionSummary
            self.itemContentHash = itemContentHash
            self.items = items
            self.resourceId = resourceId
            self.resourceType = resourceType
            self.uploadType = uploadType
        }

        public func validate(name: String) throws {
            try self.validate(self.complianceType, name: "complianceType", parent: name, max: 100)
            try self.validate(self.complianceType, name: "complianceType", parent: name, min: 1)
            try self.validate(self.complianceType, name: "complianceType", parent: name, pattern: "^[A-Za-z0-9_\\-]\\w+|Custom:[a-zA-Z0-9_\\-]\\w+$")
            try self.executionSummary.validate(name: "\(name).executionSummary")
            try self.validate(self.itemContentHash, name: "itemContentHash", parent: name, max: 256)
            try self.items.forEach {
                try $0.validate(name: "\(name).items[]")
            }
            try self.validate(self.items, name: "items", parent: name, max: 10000)
            try self.validate(self.resourceId, name: "resourceId", parent: name, max: 100)
            try self.validate(self.resourceId, name: "resourceId", parent: name, min: 1)
            try self.validate(self.resourceType, name: "resourceType", parent: name, max: 50)
            try self.validate(self.resourceType, name: "resourceType", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case complianceType = "ComplianceType"
            case executionSummary = "ExecutionSummary"
            case itemContentHash = "ItemContentHash"
            case items = "Items"
            case resourceId = "ResourceId"
            case resourceType = "ResourceType"
            case uploadType = "UploadType"
        }
    }

    public struct PutComplianceItemsResult: AWSDecodableShape {
        public init() {}
    }

    public struct PutInventoryRequest: AWSEncodableShape {
        /// An managed node ID where you want to add or update inventory items.
        public let instanceId: String
        /// The inventory items that you want to add or update on managed nodes.
        public let items: [InventoryItem]

        @inlinable
        public init(instanceId: String, items: [InventoryItem]) {
            self.instanceId = instanceId
            self.items = items
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            try self.items.forEach {
                try $0.validate(name: "\(name).items[]")
            }
            try self.validate(self.items, name: "items", parent: name, max: 30)
            try self.validate(self.items, name: "items", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
            case items = "Items"
        }
    }

    public struct PutInventoryResult: AWSDecodableShape {
        /// Information about the request.
        public let message: String?

        @inlinable
        public init(message: String? = nil) {
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case message = "Message"
        }
    }

    public struct PutParameterRequest: AWSEncodableShape {
        /// A regular expression used to validate the parameter value. For example, for String types with values restricted to numbers, you can specify the following: AllowedPattern=^\d+$
        public let allowedPattern: String?
        /// The data type for a String parameter. Supported data types include plain text and Amazon Machine Image (AMI) IDs.  The following data type values are supported.     text     aws:ec2:image     aws:ssm:integration    When you create a String parameter and specify aws:ec2:image, Amazon Web Services Systems Manager validates the parameter value is in the required format, such as ami-12345abcdeEXAMPLE, and that the specified AMI is available in your Amazon Web Services account.  If the action is successful, the service sends back an HTTP 200 response which indicates a successful PutParameter call for all cases except for data type aws:ec2:image. If you call PutParameter with aws:ec2:image data type, a successful HTTP 200 response does not guarantee that your parameter was successfully created or updated. The aws:ec2:image value is validated asynchronously, and the PutParameter call returns before the validation is complete. If you submit an invalid AMI value, the PutParameter operation will return success, but the asynchronous validation will fail and the parameter will not be created or updated. To monitor whether your aws:ec2:image parameters are created successfully, see Setting up notifications or trigger actions based on Parameter Store events. For more information about AMI format validation , see Native parameter support for Amazon Machine Image IDs.
        public let dataType: String?
        /// Information about the parameter that you want to add to the system. Optional but recommended.  Don't enter personally identifiable information in this field.
        public let description: String?
        /// The Key Management Service (KMS) ID that you want to use to encrypt a parameter. Use a custom key for better security. Required for parameters that use the SecureString data type. If you don't specify a key ID, the system uses the default key associated with your Amazon Web Services account, which is not as secure as using a custom key.   To use a custom KMS key, choose the SecureString data type with the Key ID parameter.
        public let keyId: String?
        /// The fully qualified name of the parameter that you want to create or update.  You can't enter the Amazon Resource Name (ARN) for a parameter, only the parameter name itself.  The fully qualified name includes the complete hierarchy of the parameter path and name. For parameters in a hierarchy, you must include a leading forward slash character (/) when you create or reference a parameter. For example: /Dev/DBServer/MySQL/db-string13  Naming Constraints:   Parameter names are case sensitive.   A parameter name must be unique within an Amazon Web Services Region   A parameter name can't be prefixed with "aws" or "ssm" (case-insensitive).   Parameter names can include only the following symbols and letters: a-zA-Z0-9_.-  In addition, the slash character ( / ) is used to delineate hierarchies in parameter names. For example: /Dev/Production/East/Project-ABC/MyParameter    Parameter names can't contain spaces. The service removes any spaces specified for the beginning or end of a parameter name. If the specified name for a parameter contains spaces between characters, the request fails with a ValidationException error.   Parameter hierarchies are limited to a maximum depth of fifteen levels.   For additional information about valid values for parameter names, see Creating Systems Manager parameters in the Amazon Web Services Systems Manager User Guide.  The reported maximum length of 2048 characters for a parameter name includes 1037 characters that are reserved for internal use by Systems Manager. The maximum length for a parameter name that you specify is 1011 characters. This count of 1011 characters includes the characters in the ARN that precede the name you specify. This ARN length will vary depending on your partition and Region. For example, the following 45 characters count toward the 1011 character maximum for a parameter created in the US East (Ohio) Region: arn:aws:ssm:us-east-2:111122223333:parameter/.
        public let name: String
        /// Overwrite an existing parameter. The default value is false.
        public let overwrite: Bool?
        /// One or more policies to apply to a parameter. This operation takes a JSON array. Parameter Store, a tool in Amazon Web Services Systems Manager supports the following policy types: Expiration: This policy deletes the parameter after it expires. When you create the policy, you specify the expiration date. You can update the expiration date and time by updating the policy. Updating the parameter doesn't affect the expiration date and time. When the expiration time is reached, Parameter Store deletes the parameter. ExpirationNotification: This policy initiates an event in Amazon CloudWatch Events that notifies you about the expiration. By using this policy, you can receive notification before or after the expiration time is reached, in units of days or hours. NoChangeNotification: This policy initiates a CloudWatch Events event if a parameter hasn't been modified for a specified period of time. This policy type is useful when, for example, a secret needs to be changed within a period of time, but it hasn't been changed. All existing policies are preserved until you send new policies or an empty policy. For more information about parameter policies, see Assigning parameter policies.
        public let policies: String?
        /// Optional metadata that you assign to a resource. Tags enable you to categorize a resource in different ways, such as by purpose, owner, or environment. For example, you might want to tag a Systems Manager parameter to identify the type of resource to which it applies, the environment, or the type of configuration data referenced by the parameter. In this case, you could specify the following key-value pairs:    Key=Resource,Value=S3bucket     Key=OS,Value=Windows     Key=ParameterType,Value=LicenseKey     To add tags to an existing Systems Manager parameter, use the AddTagsToResource operation.
        public let tags: [Tag]?
        /// The parameter tier to assign to a parameter. Parameter Store offers a standard tier and an advanced tier for parameters. Standard parameters have a content size limit of 4 KB and can't be configured to use parameter policies. You can create a maximum of 10,000 standard parameters for each Region in an Amazon Web Services account. Standard parameters are offered at no additional cost.  Advanced parameters have a content size limit of 8 KB and can be configured to use parameter policies. You can create a maximum of 100,000 advanced parameters for each Region in an Amazon Web Services account. Advanced parameters incur a charge. For more information, see Managing parameter tiers in the Amazon Web Services Systems Manager User Guide. You can change a standard parameter to an advanced parameter any time. But you can't revert an advanced parameter to a standard parameter. Reverting an advanced parameter to a standard parameter would result in data loss because the system would truncate the size of the parameter from 8 KB to 4 KB. Reverting would also remove any policies attached to the parameter. Lastly, advanced parameters use a different form of encryption than standard parameters.  If you no longer need an advanced parameter, or if you no longer want to incur charges for an advanced parameter, you must delete it and recreate it as a new standard parameter.   Using the Default Tier Configuration  In PutParameter requests, you can specify the tier to create the parameter in. Whenever you specify a tier in the request, Parameter Store creates or updates the parameter according to that request. However, if you don't specify a tier in a request, Parameter Store assigns the tier based on the current Parameter Store default tier configuration. The default tier when you begin using Parameter Store is the standard-parameter tier. If you use the advanced-parameter tier, you can specify one of the following as the default:    Advanced: With this option, Parameter Store evaluates all requests as advanced parameters.     Intelligent-Tiering: With this option, Parameter Store evaluates each request to determine if the parameter is standard or advanced.  If the request doesn't include any options that require an advanced parameter, the parameter is created in the standard-parameter tier. If one or more options requiring an advanced parameter are included in the request, Parameter Store create a parameter in the advanced-parameter tier. This approach helps control your parameter-related costs by always creating standard parameters unless an advanced parameter is necessary.    Options that require an advanced parameter include the following:   The content size of the parameter is more than 4 KB.   The parameter uses a parameter policy.   More than 10,000 parameters already exist in your Amazon Web Services account in the current Amazon Web Services Region.   For more information about configuring the default tier option, see Specifying a default parameter tier in the Amazon Web Services Systems Manager User Guide.
        public let tier: ParameterTier?
        /// The type of parameter that you want to create.   SecureString isn't currently supported for CloudFormation templates.  Items in a StringList must be separated by a comma (,). You can't use other punctuation or special character to escape items in the list. If you have a parameter value that requires a comma, then use the String data type.  Specifying a parameter type isn't required when updating a parameter. You must specify a parameter type when creating a parameter.
        public let type: ParameterType?
        /// The parameter value that you want to add to the system. Standard parameters have a value limit of 4 KB. Advanced parameters have a value limit of 8 KB.  Parameters can't be referenced or nested in the values of other parameters. You can't include values wrapped in double brackets {{}} or {{ssm:parameter-name}} in a parameter value.
        public let value: String

        @inlinable
        public init(allowedPattern: String? = nil, dataType: String? = nil, description: String? = nil, keyId: String? = nil, name: String, overwrite: Bool? = nil, policies: String? = nil, tags: [Tag]? = nil, tier: ParameterTier? = nil, type: ParameterType? = nil, value: String) {
            self.allowedPattern = allowedPattern
            self.dataType = dataType
            self.description = description
            self.keyId = keyId
            self.name = name
            self.overwrite = overwrite
            self.policies = policies
            self.tags = tags
            self.tier = tier
            self.type = type
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.allowedPattern, name: "allowedPattern", parent: name, max: 1024)
            try self.validate(self.dataType, name: "dataType", parent: name, max: 128)
            try self.validate(self.description, name: "description", parent: name, max: 1024)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 256)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.validate(self.keyId, name: "keyId", parent: name, pattern: "^([a-zA-Z0-9:/_-]+)$")
            try self.validate(self.name, name: "name", parent: name, max: 2048)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.policies, name: "policies", parent: name, max: 4096)
            try self.validate(self.policies, name: "policies", parent: name, min: 1)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 1000)
        }

        private enum CodingKeys: String, CodingKey {
            case allowedPattern = "AllowedPattern"
            case dataType = "DataType"
            case description = "Description"
            case keyId = "KeyId"
            case name = "Name"
            case overwrite = "Overwrite"
            case policies = "Policies"
            case tags = "Tags"
            case tier = "Tier"
            case type = "Type"
            case value = "Value"
        }
    }

    public struct PutParameterResult: AWSDecodableShape {
        /// The tier assigned to the parameter.
        public let tier: ParameterTier?
        /// The new version number of a parameter. If you edit a parameter value, Parameter Store automatically creates a new version and assigns this new version a unique ID. You can reference a parameter version ID in API operations or in Systems Manager documents (SSM documents). By default, if you don't specify a specific version, the system returns the latest parameter value when a parameter is called.
        public let version: Int64?

        @inlinable
        public init(tier: ParameterTier? = nil, version: Int64? = nil) {
            self.tier = tier
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case tier = "Tier"
            case version = "Version"
        }
    }

    public struct PutResourcePolicyRequest: AWSEncodableShape {
        /// A policy you want to associate with a resource.
        public let policy: String
        /// ID of the current policy version. The hash helps to prevent a situation where multiple users attempt to overwrite a policy. You must provide this hash when updating or deleting a policy.
        public let policyHash: String?
        /// The policy ID.
        public let policyId: String?
        /// Amazon Resource Name (ARN) of the resource to which you want to attach a policy.
        public let resourceArn: String

        @inlinable
        public init(policy: String, policyHash: String? = nil, policyId: String? = nil, resourceArn: String) {
            self.policy = policy
            self.policyHash = policyHash
            self.policyId = policyId
            self.resourceArn = resourceArn
        }

        public func validate(name: String) throws {
            try self.validate(self.policy, name: "policy", parent: name, pattern: "^(?!\\s*$).+$")
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, max: 2048)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, min: 20)
        }

        private enum CodingKeys: String, CodingKey {
            case policy = "Policy"
            case policyHash = "PolicyHash"
            case policyId = "PolicyId"
            case resourceArn = "ResourceArn"
        }
    }

    public struct PutResourcePolicyResponse: AWSDecodableShape {
        /// ID of the current policy version.
        public let policyHash: String?
        /// The policy ID. To update a policy, you must specify PolicyId and PolicyHash.
        public let policyId: String?

        @inlinable
        public init(policyHash: String? = nil, policyId: String? = nil) {
            self.policyHash = policyHash
            self.policyId = policyId
        }

        private enum CodingKeys: String, CodingKey {
            case policyHash = "PolicyHash"
            case policyId = "PolicyId"
        }
    }

    public struct RegisterDefaultPatchBaselineRequest: AWSEncodableShape {
        /// The ID of the patch baseline that should be the default patch baseline.
        public let baselineId: String

        @inlinable
        public init(baselineId: String) {
            self.baselineId = baselineId
        }

        public func validate(name: String) throws {
            try self.validate(self.baselineId, name: "baselineId", parent: name, max: 128)
            try self.validate(self.baselineId, name: "baselineId", parent: name, min: 20)
            try self.validate(self.baselineId, name: "baselineId", parent: name, pattern: "^[a-zA-Z0-9_\\-:/]{20,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case baselineId = "BaselineId"
        }
    }

    public struct RegisterDefaultPatchBaselineResult: AWSDecodableShape {
        /// The ID of the default patch baseline.
        public let baselineId: String?

        @inlinable
        public init(baselineId: String? = nil) {
            self.baselineId = baselineId
        }

        private enum CodingKeys: String, CodingKey {
            case baselineId = "BaselineId"
        }
    }

    public struct RegisterPatchBaselineForPatchGroupRequest: AWSEncodableShape {
        /// The ID of the patch baseline to register with the patch group.
        public let baselineId: String
        /// The name of the patch group to be registered with the patch baseline.
        public let patchGroup: String

        @inlinable
        public init(baselineId: String, patchGroup: String) {
            self.baselineId = baselineId
            self.patchGroup = patchGroup
        }

        public func validate(name: String) throws {
            try self.validate(self.baselineId, name: "baselineId", parent: name, max: 128)
            try self.validate(self.baselineId, name: "baselineId", parent: name, min: 20)
            try self.validate(self.baselineId, name: "baselineId", parent: name, pattern: "^[a-zA-Z0-9_\\-:/]{20,128}$")
            try self.validate(self.patchGroup, name: "patchGroup", parent: name, max: 256)
            try self.validate(self.patchGroup, name: "patchGroup", parent: name, min: 1)
            try self.validate(self.patchGroup, name: "patchGroup", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
        }

        private enum CodingKeys: String, CodingKey {
            case baselineId = "BaselineId"
            case patchGroup = "PatchGroup"
        }
    }

    public struct RegisterPatchBaselineForPatchGroupResult: AWSDecodableShape {
        /// The ID of the patch baseline the patch group was registered with.
        public let baselineId: String?
        /// The name of the patch group registered with the patch baseline.
        public let patchGroup: String?

        @inlinable
        public init(baselineId: String? = nil, patchGroup: String? = nil) {
            self.baselineId = baselineId
            self.patchGroup = patchGroup
        }

        private enum CodingKeys: String, CodingKey {
            case baselineId = "BaselineId"
            case patchGroup = "PatchGroup"
        }
    }

    public struct RegisterTargetWithMaintenanceWindowRequest: AWSEncodableShape {
        /// User-provided idempotency token.
        public let clientToken: String?
        /// An optional description for the target.
        public let description: String?
        /// An optional name for the target.
        public let name: String?
        /// User-provided value that will be included in any Amazon CloudWatch Events events raised while running tasks for these targets in this maintenance window.
        public let ownerInformation: String?
        /// The type of target being registered with the maintenance window.
        public let resourceType: MaintenanceWindowResourceType
        /// The targets to register with the maintenance window. In other words, the managed nodes to run commands on when the maintenance window runs.  If a single maintenance window task is registered with multiple targets, its task invocations occur sequentially and not in parallel. If your task must run on multiple targets at the same time, register a task for each target individually and assign each task the same priority level.  You can specify targets using managed node IDs, resource group names, or tags that have been applied to managed nodes.  Example 1: Specify managed node IDs  Key=InstanceIds,Values=,,   Example 2: Use tag key-pairs applied to managed nodes  Key=tag:,Values=,   Example 3: Use tag-keys applied to managed nodes  Key=tag-key,Values=,   Example 4: Use resource group names  Key=resource-groups:Name,Values=   Example 5: Use filters for resource group types  Key=resource-groups:ResourceTypeFilters,Values=,   For Key=resource-groups:ResourceTypeFilters, specify resource types in the following format  Key=resource-groups:ResourceTypeFilters,Values=AWS::EC2::INSTANCE,AWS::EC2::VPC   For more information about these examples formats, including the best use case for each one, see Examples: Register targets with a maintenance window in the Amazon Web Services Systems Manager User Guide.
        public let targets: [Target]
        /// The ID of the maintenance window the target should be registered with.
        public let windowId: String

        @inlinable
        public init(clientToken: String? = RegisterTargetWithMaintenanceWindowRequest.idempotencyToken(), description: String? = nil, name: String? = nil, ownerInformation: String? = nil, resourceType: MaintenanceWindowResourceType, targets: [Target], windowId: String) {
            self.clientToken = clientToken
            self.description = description
            self.name = name
            self.ownerInformation = ownerInformation
            self.resourceType = resourceType
            self.targets = targets
            self.windowId = windowId
        }

        public func validate(name: String) throws {
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 64)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, max: 128)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 128)
            try self.validate(self.name, name: "name", parent: name, min: 3)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.validate(self.ownerInformation, name: "ownerInformation", parent: name, max: 128)
            try self.validate(self.ownerInformation, name: "ownerInformation", parent: name, min: 1)
            try self.targets.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
            try self.validate(self.targets, name: "targets", parent: name, max: 5)
            try self.validate(self.windowId, name: "windowId", parent: name, max: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, min: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, pattern: "^mw-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case clientToken = "ClientToken"
            case description = "Description"
            case name = "Name"
            case ownerInformation = "OwnerInformation"
            case resourceType = "ResourceType"
            case targets = "Targets"
            case windowId = "WindowId"
        }
    }

    public struct RegisterTargetWithMaintenanceWindowResult: AWSDecodableShape {
        /// The ID of the target definition in this maintenance window.
        public let windowTargetId: String?

        @inlinable
        public init(windowTargetId: String? = nil) {
            self.windowTargetId = windowTargetId
        }

        private enum CodingKeys: String, CodingKey {
            case windowTargetId = "WindowTargetId"
        }
    }

    public struct RegisterTaskWithMaintenanceWindowRequest: AWSEncodableShape {
        /// The CloudWatch alarm you want to apply to your maintenance window task.
        public let alarmConfiguration: AlarmConfiguration?
        /// User-provided idempotency token.
        public let clientToken: String?
        /// Indicates whether tasks should continue to run after the cutoff time specified in the maintenance windows is reached.     CONTINUE_TASK: When the cutoff time is reached, any tasks that are running continue. The default value.    CANCEL_TASK:   For Automation, Lambda, Step Functions tasks: When the cutoff time is reached, any task invocations that are already running continue, but no new task invocations are started.   For Run Command tasks: When the cutoff time is reached, the system sends a CancelCommand operation that attempts to cancel the command associated with the task. However, there is no guarantee that the command will be terminated and the underlying process stopped.   The status for tasks that are not completed is TIMED_OUT.
        public let cutoffBehavior: MaintenanceWindowTaskCutoffBehavior?
        /// An optional description for the task.
        public let description: String?
        /// A structure containing information about an Amazon Simple Storage Service (Amazon S3) bucket to write managed node-level logs to.    LoggingInfo has been deprecated. To specify an Amazon Simple Storage Service (Amazon S3) bucket to contain logs, instead use the OutputS3BucketName and OutputS3KeyPrefix options in the TaskInvocationParameters structure. For information about how Amazon Web Services Systems Manager handles these options for the supported maintenance window task types, see MaintenanceWindowTaskInvocationParameters.
        public let loggingInfo: LoggingInfo?
        /// The maximum number of targets this task can be run for, in parallel.  Although this element is listed as "Required: No", a value can be omitted only when you are registering or updating a targetless task You must provide a value in all other cases. For maintenance window tasks without a target specified, you can't supply a value for this option. Instead, the system inserts a placeholder value of 1. This value doesn't affect the running of your task.
        public let maxConcurrency: String?
        /// The maximum number of errors allowed before this task stops being scheduled.  Although this element is listed as "Required: No", a value can be omitted only when you are registering or updating a targetless task You must provide a value in all other cases. For maintenance window tasks without a target specified, you can't supply a value for this option. Instead, the system inserts a placeholder value of 1. This value doesn't affect the running of your task.
        public let maxErrors: String?
        /// An optional name for the task.
        public let name: String?
        /// The priority of the task in the maintenance window, the lower the number the higher the priority. Tasks in a maintenance window are scheduled in priority order with tasks that have the same priority scheduled in parallel.
        public let priority: Int?
        /// The Amazon Resource Name (ARN) of the IAM service role for Amazon Web Services Systems Manager to assume when running a maintenance window task. If you do not specify a service role ARN, Systems Manager uses a service-linked role in your account. If no appropriate service-linked role for Systems Manager exists in your account, it is created when you run RegisterTaskWithMaintenanceWindow. However, for an improved security posture, we strongly recommend creating a custom policy and custom service role for running your maintenance window tasks. The policy can be crafted to provide only the permissions needed for your particular maintenance window tasks. For more information, see Setting up Maintenance Windows in the in the Amazon Web Services Systems Manager User Guide.
        public let serviceRoleArn: String?
        /// The targets (either managed nodes or maintenance window targets).  One or more targets must be specified for maintenance window Run Command-type tasks. Depending on the task, targets are optional for other maintenance window task types (Automation, Lambda, and Step Functions). For more information about running tasks that don't specify targets, see Registering maintenance window tasks without targets in the Amazon Web Services Systems Manager User Guide.  Specify managed nodes using the following format:   Key=InstanceIds,Values=,  Specify maintenance window targets using the following format:  Key=WindowTargetIds,Values=,
        public let targets: [Target]?
        /// The ARN of the task to run.
        public let taskArn: String
        /// The parameters that the task should use during execution. Populate only the fields that match the task type. All other fields should be empty.
        public let taskInvocationParameters: MaintenanceWindowTaskInvocationParameters?
        /// The parameters that should be passed to the task when it is run.   TaskParameters has been deprecated. To specify parameters to pass to a task when it runs, instead use the Parameters option in the TaskInvocationParameters structure. For information about how Systems Manager handles these options for the supported maintenance window task types, see MaintenanceWindowTaskInvocationParameters.
        public let taskParameters: [String: MaintenanceWindowTaskParameterValueExpression]?
        /// The type of task being registered.
        public let taskType: MaintenanceWindowTaskType
        /// The ID of the maintenance window the task should be added to.
        public let windowId: String

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, clientToken: String? = RegisterTaskWithMaintenanceWindowRequest.idempotencyToken(), cutoffBehavior: MaintenanceWindowTaskCutoffBehavior? = nil, description: String? = nil, loggingInfo: LoggingInfo? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, name: String? = nil, priority: Int? = nil, serviceRoleArn: String? = nil, targets: [Target]? = nil, taskArn: String, taskInvocationParameters: MaintenanceWindowTaskInvocationParameters? = nil, taskParameters: [String: MaintenanceWindowTaskParameterValueExpression]? = nil, taskType: MaintenanceWindowTaskType, windowId: String) {
            self.alarmConfiguration = alarmConfiguration
            self.clientToken = clientToken
            self.cutoffBehavior = cutoffBehavior
            self.description = description
            self.loggingInfo = loggingInfo
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.name = name
            self.priority = priority
            self.serviceRoleArn = serviceRoleArn
            self.targets = targets
            self.taskArn = taskArn
            self.taskInvocationParameters = taskInvocationParameters
            self.taskParameters = taskParameters
            self.taskType = taskType
            self.windowId = windowId
        }

        public func validate(name: String) throws {
            try self.alarmConfiguration?.validate(name: "\(name).alarmConfiguration")
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 64)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, max: 128)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.loggingInfo?.validate(name: "\(name).loggingInfo")
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, max: 7)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, min: 1)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, pattern: "^([1-9][0-9]*|[1-9][0-9]%|[1-9]%|100%)$")
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, max: 7)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, min: 1)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, pattern: "^([1-9][0-9]*|[0]|[1-9][0-9]%|[0-9]%|100%)$")
            try self.validate(self.name, name: "name", parent: name, max: 128)
            try self.validate(self.name, name: "name", parent: name, min: 3)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.validate(self.priority, name: "priority", parent: name, min: 0)
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
            try self.validate(self.targets, name: "targets", parent: name, max: 5)
            try self.validate(self.taskArn, name: "taskArn", parent: name, max: 1600)
            try self.validate(self.taskArn, name: "taskArn", parent: name, min: 1)
            try self.taskInvocationParameters?.validate(name: "\(name).taskInvocationParameters")
            try self.taskParameters?.forEach {
                try validate($0.key, name: "taskParameters.key", parent: name, max: 255)
                try validate($0.key, name: "taskParameters.key", parent: name, min: 1)
                try $0.value.validate(name: "\(name).taskParameters[\"\($0.key)\"]")
            }
            try self.validate(self.windowId, name: "windowId", parent: name, max: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, min: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, pattern: "^mw-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case clientToken = "ClientToken"
            case cutoffBehavior = "CutoffBehavior"
            case description = "Description"
            case loggingInfo = "LoggingInfo"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case name = "Name"
            case priority = "Priority"
            case serviceRoleArn = "ServiceRoleArn"
            case targets = "Targets"
            case taskArn = "TaskArn"
            case taskInvocationParameters = "TaskInvocationParameters"
            case taskParameters = "TaskParameters"
            case taskType = "TaskType"
            case windowId = "WindowId"
        }
    }

    public struct RegisterTaskWithMaintenanceWindowResult: AWSDecodableShape {
        /// The ID of the task in the maintenance window.
        public let windowTaskId: String?

        @inlinable
        public init(windowTaskId: String? = nil) {
            self.windowTaskId = windowTaskId
        }

        private enum CodingKeys: String, CodingKey {
            case windowTaskId = "WindowTaskId"
        }
    }

    public struct RegistrationMetadataItem: AWSEncodableShape {
        /// Reserved for internal use.
        public let key: String
        /// Reserved for internal use.
        public let value: String

        @inlinable
        public init(key: String, value: String) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 128)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.validate(self.key, name: "key", parent: name, pattern: "^(?!\\s*$).+$")
            try self.validate(self.value, name: "value", parent: name, max: 2048)
            try self.validate(self.value, name: "value", parent: name, min: 1)
            try self.validate(self.value, name: "value", parent: name, pattern: "^(?!\\s*$).+$")
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct RelatedOpsItem: AWSEncodableShape & AWSDecodableShape {
        /// The ID of an OpsItem related to the current OpsItem.
        public let opsItemId: String

        @inlinable
        public init(opsItemId: String) {
            self.opsItemId = opsItemId
        }

        private enum CodingKeys: String, CodingKey {
            case opsItemId = "OpsItemId"
        }
    }

    public struct RemoveTagsFromResourceRequest: AWSEncodableShape {
        /// The ID of the resource from which you want to remove tags. For example: ManagedInstance: mi-012345abcde MaintenanceWindow: mw-012345abcde  Automation: example-c160-4567-8519-012345abcde  PatchBaseline: pb-012345abcde OpsMetadata object: ResourceID for tagging is created from the Amazon Resource Name (ARN) for the object. Specifically, ResourceID is created from the strings that come after the word opsmetadata in the ARN. For example, an OpsMetadata object with an ARN of arn:aws:ssm:us-east-2:1234567890:opsmetadata/aws/ssm/MyGroup/appmanager has a ResourceID of either aws/ssm/MyGroup/appmanager or /aws/ssm/MyGroup/appmanager. For the Document and Parameter values, use the name of the resource.  The ManagedInstance type for this API operation is only for on-premises managed nodes. Specify the name of the managed node in the following format: mi-ID_number. For example, mi-1a2b3c4d5e6f.
        public let resourceId: String
        /// The type of resource from which you want to remove a tag.  The ManagedInstance type for this API operation is only for on-premises managed nodes. Specify the name of the managed node in the following format: mi-ID_number . For example, mi-1a2b3c4d5e6f.
        public let resourceType: ResourceTypeForTagging
        /// Tag keys that you want to remove from the specified resource.
        public let tagKeys: [String]

        @inlinable
        public init(resourceId: String, resourceType: ResourceTypeForTagging, tagKeys: [String]) {
            self.resourceId = resourceId
            self.resourceType = resourceType
            self.tagKeys = tagKeys
        }

        public func validate(name: String) throws {
            try self.tagKeys.forEach {
                try validate($0, name: "tagKeys[]", parent: name, max: 128)
                try validate($0, name: "tagKeys[]", parent: name, min: 1)
                try validate($0, name: "tagKeys[]", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case resourceId = "ResourceId"
            case resourceType = "ResourceType"
            case tagKeys = "TagKeys"
        }
    }

    public struct RemoveTagsFromResourceResult: AWSDecodableShape {
        public init() {}
    }

    public struct ResetServiceSettingRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the service setting to reset. The setting ID can be one of the following.    /ssm/appmanager/appmanager-enabled     /ssm/automation/customer-script-log-destination     /ssm/automation/customer-script-log-group-name    /ssm/automation/enable-adaptive-concurrency    /ssm/documents/console/public-sharing-permission     /ssm/managed-instance/activation-tier     /ssm/managed-instance/default-ec2-instance-management-role     /ssm/opsinsights/opscenter     /ssm/parameter-store/default-parameter-tier     /ssm/parameter-store/high-throughput-enabled
        public let settingId: String

        @inlinable
        public init(settingId: String) {
            self.settingId = settingId
        }

        public func validate(name: String) throws {
            try self.validate(self.settingId, name: "settingId", parent: name, max: 1000)
            try self.validate(self.settingId, name: "settingId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case settingId = "SettingId"
        }
    }

    public struct ResetServiceSettingResult: AWSDecodableShape {
        /// The current, effective service setting after calling the ResetServiceSetting API operation.
        public let serviceSetting: ServiceSetting?

        @inlinable
        public init(serviceSetting: ServiceSetting? = nil) {
            self.serviceSetting = serviceSetting
        }

        private enum CodingKeys: String, CodingKey {
            case serviceSetting = "ServiceSetting"
        }
    }

    public struct ResolvedTargets: AWSDecodableShape {
        /// A list of parameter values sent to targets that resolved during the Automation execution.
        public let parameterValues: [String]?
        /// A boolean value indicating whether the resolved target list is truncated.
        public let truncated: Bool?

        @inlinable
        public init(parameterValues: [String]? = nil, truncated: Bool? = nil) {
            self.parameterValues = parameterValues
            self.truncated = truncated
        }

        private enum CodingKeys: String, CodingKey {
            case parameterValues = "ParameterValues"
            case truncated = "Truncated"
        }
    }

    public struct ResourceComplianceSummaryItem: AWSDecodableShape {
        /// The compliance type.
        public let complianceType: String?
        /// A list of items that are compliant for the resource.
        public let compliantSummary: CompliantSummary?
        /// Information about the execution.
        public let executionSummary: ComplianceExecutionSummary?
        /// A list of items that aren't compliant for the resource.
        public let nonCompliantSummary: NonCompliantSummary?
        /// The highest severity item found for the resource. The resource is compliant for this item.
        public let overallSeverity: ComplianceSeverity?
        /// The resource ID.
        public let resourceId: String?
        /// The resource type.
        public let resourceType: String?
        /// The compliance status for the resource.
        public let status: ComplianceStatus?

        @inlinable
        public init(complianceType: String? = nil, compliantSummary: CompliantSummary? = nil, executionSummary: ComplianceExecutionSummary? = nil, nonCompliantSummary: NonCompliantSummary? = nil, overallSeverity: ComplianceSeverity? = nil, resourceId: String? = nil, resourceType: String? = nil, status: ComplianceStatus? = nil) {
            self.complianceType = complianceType
            self.compliantSummary = compliantSummary
            self.executionSummary = executionSummary
            self.nonCompliantSummary = nonCompliantSummary
            self.overallSeverity = overallSeverity
            self.resourceId = resourceId
            self.resourceType = resourceType
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case complianceType = "ComplianceType"
            case compliantSummary = "CompliantSummary"
            case executionSummary = "ExecutionSummary"
            case nonCompliantSummary = "NonCompliantSummary"
            case overallSeverity = "OverallSeverity"
            case resourceId = "ResourceId"
            case resourceType = "ResourceType"
            case status = "Status"
        }
    }

    public struct ResourceDataSyncAlreadyExistsException: AWSErrorShape {
        public let syncName: String?

        @inlinable
        public init(syncName: String? = nil) {
            self.syncName = syncName
        }

        private enum CodingKeys: String, CodingKey {
            case syncName = "SyncName"
        }
    }

    public struct ResourceDataSyncAwsOrganizationsSource: AWSEncodableShape & AWSDecodableShape {
        /// The Organizations organization units included in the sync.
        public let organizationalUnits: [ResourceDataSyncOrganizationalUnit]?
        /// If an Amazon Web Services organization is present, this is either OrganizationalUnits or EntireOrganization. For OrganizationalUnits, the data is aggregated from a set of organization units. For EntireOrganization, the data is aggregated from the entire Amazon Web Services organization.
        public let organizationSourceType: String

        @inlinable
        public init(organizationalUnits: [ResourceDataSyncOrganizationalUnit]? = nil, organizationSourceType: String) {
            self.organizationalUnits = organizationalUnits
            self.organizationSourceType = organizationSourceType
        }

        public func validate(name: String) throws {
            try self.organizationalUnits?.forEach {
                try $0.validate(name: "\(name).organizationalUnits[]")
            }
            try self.validate(self.organizationalUnits, name: "organizationalUnits", parent: name, max: 1000)
            try self.validate(self.organizationalUnits, name: "organizationalUnits", parent: name, min: 1)
            try self.validate(self.organizationSourceType, name: "organizationSourceType", parent: name, max: 64)
            try self.validate(self.organizationSourceType, name: "organizationSourceType", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case organizationalUnits = "OrganizationalUnits"
            case organizationSourceType = "OrganizationSourceType"
        }
    }

    public struct ResourceDataSyncDestinationDataSharing: AWSEncodableShape & AWSDecodableShape {
        /// The sharing data type. Only Organization is supported.
        public let destinationDataSharingType: String?

        @inlinable
        public init(destinationDataSharingType: String? = nil) {
            self.destinationDataSharingType = destinationDataSharingType
        }

        public func validate(name: String) throws {
            try self.validate(self.destinationDataSharingType, name: "destinationDataSharingType", parent: name, max: 64)
            try self.validate(self.destinationDataSharingType, name: "destinationDataSharingType", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case destinationDataSharingType = "DestinationDataSharingType"
        }
    }

    public struct ResourceDataSyncItem: AWSDecodableShape {
        /// The status reported by the last sync.
        public let lastStatus: LastResourceDataSyncStatus?
        /// The last time the sync operations returned a status of SUCCESSFUL (UTC).
        public let lastSuccessfulSyncTime: Date?
        /// The status message details reported by the last sync.
        public let lastSyncStatusMessage: String?
        /// The last time the configuration attempted to sync (UTC).
        public let lastSyncTime: Date?
        /// Configuration information for the target S3 bucket.
        public let s3Destination: ResourceDataSyncS3Destination?
        /// The date and time the configuration was created (UTC).
        public let syncCreatedTime: Date?
        /// The date and time the resource data sync was changed.
        public let syncLastModifiedTime: Date?
        /// The name of the resource data sync.
        public let syncName: String?
        /// Information about the source where the data was synchronized.
        public let syncSource: ResourceDataSyncSourceWithState?
        /// The type of resource data sync. If SyncType is SyncToDestination, then the resource data sync synchronizes data to an S3 bucket. If the SyncType is SyncFromSource then the resource data sync synchronizes data from Organizations or from multiple Amazon Web Services Regions.
        public let syncType: String?

        @inlinable
        public init(lastStatus: LastResourceDataSyncStatus? = nil, lastSuccessfulSyncTime: Date? = nil, lastSyncStatusMessage: String? = nil, lastSyncTime: Date? = nil, s3Destination: ResourceDataSyncS3Destination? = nil, syncCreatedTime: Date? = nil, syncLastModifiedTime: Date? = nil, syncName: String? = nil, syncSource: ResourceDataSyncSourceWithState? = nil, syncType: String? = nil) {
            self.lastStatus = lastStatus
            self.lastSuccessfulSyncTime = lastSuccessfulSyncTime
            self.lastSyncStatusMessage = lastSyncStatusMessage
            self.lastSyncTime = lastSyncTime
            self.s3Destination = s3Destination
            self.syncCreatedTime = syncCreatedTime
            self.syncLastModifiedTime = syncLastModifiedTime
            self.syncName = syncName
            self.syncSource = syncSource
            self.syncType = syncType
        }

        private enum CodingKeys: String, CodingKey {
            case lastStatus = "LastStatus"
            case lastSuccessfulSyncTime = "LastSuccessfulSyncTime"
            case lastSyncStatusMessage = "LastSyncStatusMessage"
            case lastSyncTime = "LastSyncTime"
            case s3Destination = "S3Destination"
            case syncCreatedTime = "SyncCreatedTime"
            case syncLastModifiedTime = "SyncLastModifiedTime"
            case syncName = "SyncName"
            case syncSource = "SyncSource"
            case syncType = "SyncType"
        }
    }

    public struct ResourceDataSyncNotFoundException: AWSErrorShape {
        public let message: String?
        public let syncName: String?
        public let syncType: String?

        @inlinable
        public init(message: String? = nil, syncName: String? = nil, syncType: String? = nil) {
            self.message = message
            self.syncName = syncName
            self.syncType = syncType
        }

        private enum CodingKeys: String, CodingKey {
            case message = "Message"
            case syncName = "SyncName"
            case syncType = "SyncType"
        }
    }

    public struct ResourceDataSyncOrganizationalUnit: AWSEncodableShape & AWSDecodableShape {
        /// The Organizations unit ID data source for the sync.
        public let organizationalUnitId: String?

        @inlinable
        public init(organizationalUnitId: String? = nil) {
            self.organizationalUnitId = organizationalUnitId
        }

        public func validate(name: String) throws {
            try self.validate(self.organizationalUnitId, name: "organizationalUnitId", parent: name, max: 128)
            try self.validate(self.organizationalUnitId, name: "organizationalUnitId", parent: name, min: 1)
            try self.validate(self.organizationalUnitId, name: "organizationalUnitId", parent: name, pattern: "^ou-[0-9a-z]{4,32}-[a-z0-9]{8,32}$")
        }

        private enum CodingKeys: String, CodingKey {
            case organizationalUnitId = "OrganizationalUnitId"
        }
    }

    public struct ResourceDataSyncS3Destination: AWSEncodableShape & AWSDecodableShape {
        /// The ARN of an encryption key for a destination in Amazon S3. Must belong to the same Region as the destination S3 bucket.
        public let awskmsKeyARN: String?
        /// The name of the S3 bucket where the aggregated data is stored.
        public let bucketName: String
        /// Enables destination data sharing. By default, this field is null.
        public let destinationDataSharing: ResourceDataSyncDestinationDataSharing?
        /// An Amazon S3 prefix for the bucket.
        public let prefix: String?
        /// The Amazon Web Services Region with the S3 bucket targeted by the resource data sync.
        public let region: String
        /// A supported sync format. The following format is currently supported: JsonSerDe
        public let syncFormat: ResourceDataSyncS3Format

        @inlinable
        public init(awskmsKeyARN: String? = nil, bucketName: String, destinationDataSharing: ResourceDataSyncDestinationDataSharing? = nil, prefix: String? = nil, region: String, syncFormat: ResourceDataSyncS3Format) {
            self.awskmsKeyARN = awskmsKeyARN
            self.bucketName = bucketName
            self.destinationDataSharing = destinationDataSharing
            self.prefix = prefix
            self.region = region
            self.syncFormat = syncFormat
        }

        public func validate(name: String) throws {
            try self.validate(self.awskmsKeyARN, name: "awskmsKeyARN", parent: name, max: 512)
            try self.validate(self.awskmsKeyARN, name: "awskmsKeyARN", parent: name, min: 1)
            try self.validate(self.awskmsKeyARN, name: "awskmsKeyARN", parent: name, pattern: "^arn:")
            try self.validate(self.bucketName, name: "bucketName", parent: name, max: 2048)
            try self.validate(self.bucketName, name: "bucketName", parent: name, min: 1)
            try self.destinationDataSharing?.validate(name: "\(name).destinationDataSharing")
            try self.validate(self.prefix, name: "prefix", parent: name, max: 256)
            try self.validate(self.prefix, name: "prefix", parent: name, min: 1)
            try self.validate(self.region, name: "region", parent: name, max: 64)
            try self.validate(self.region, name: "region", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case awskmsKeyARN = "AWSKMSKeyARN"
            case bucketName = "BucketName"
            case destinationDataSharing = "DestinationDataSharing"
            case prefix = "Prefix"
            case region = "Region"
            case syncFormat = "SyncFormat"
        }
    }

    public struct ResourceDataSyncSource: AWSEncodableShape {
        /// Information about the AwsOrganizationsSource resource data sync source. A sync source of this type can synchronize data from Organizations.
        public let awsOrganizationsSource: ResourceDataSyncAwsOrganizationsSource?
        /// When you create a resource data sync, if you choose one of the Organizations options, then Systems Manager automatically enables all OpsData sources in the selected Amazon Web Services Regions for all Amazon Web Services accounts in your organization (or in the selected organization units). For more information, see Setting up Systems Manager Explorer to display data from multiple accounts and Regions in the Amazon Web Services Systems Manager User Guide.
        public let enableAllOpsDataSources: Bool?
        /// Whether to automatically synchronize and aggregate data from new Amazon Web Services Regions when those Regions come online.
        public let includeFutureRegions: Bool?
        /// The SyncSource Amazon Web Services Regions included in the resource data sync.
        public let sourceRegions: [String]
        /// The type of data source for the resource data sync. SourceType is either AwsOrganizations (if an organization is present in Organizations) or SingleAccountMultiRegions.
        public let sourceType: String

        @inlinable
        public init(awsOrganizationsSource: ResourceDataSyncAwsOrganizationsSource? = nil, enableAllOpsDataSources: Bool? = nil, includeFutureRegions: Bool? = nil, sourceRegions: [String], sourceType: String) {
            self.awsOrganizationsSource = awsOrganizationsSource
            self.enableAllOpsDataSources = enableAllOpsDataSources
            self.includeFutureRegions = includeFutureRegions
            self.sourceRegions = sourceRegions
            self.sourceType = sourceType
        }

        public func validate(name: String) throws {
            try self.awsOrganizationsSource?.validate(name: "\(name).awsOrganizationsSource")
            try self.sourceRegions.forEach {
                try validate($0, name: "sourceRegions[]", parent: name, max: 64)
                try validate($0, name: "sourceRegions[]", parent: name, min: 1)
            }
            try self.validate(self.sourceType, name: "sourceType", parent: name, max: 64)
            try self.validate(self.sourceType, name: "sourceType", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case awsOrganizationsSource = "AwsOrganizationsSource"
            case enableAllOpsDataSources = "EnableAllOpsDataSources"
            case includeFutureRegions = "IncludeFutureRegions"
            case sourceRegions = "SourceRegions"
            case sourceType = "SourceType"
        }
    }

    public struct ResourceDataSyncSourceWithState: AWSDecodableShape {
        /// The field name in SyncSource for the ResourceDataSyncAwsOrganizationsSource type.
        public let awsOrganizationsSource: ResourceDataSyncAwsOrganizationsSource?
        /// When you create a resource data sync, if you choose one of the Organizations options, then Systems Manager automatically enables all OpsData sources in the selected Amazon Web Services Regions for all Amazon Web Services accounts in your organization (or in the selected organization units). For more information, see Setting up Systems Manager Explorer to display data from multiple accounts and Regions in the Amazon Web Services Systems Manager User Guide.
        public let enableAllOpsDataSources: Bool?
        /// Whether to automatically synchronize and aggregate data from new Amazon Web Services Regions when those Regions come online.
        public let includeFutureRegions: Bool?
        /// The SyncSource Amazon Web Services Regions included in the resource data sync.
        public let sourceRegions: [String]?
        /// The type of data source for the resource data sync. SourceType is either AwsOrganizations (if an organization is present in Organizations) or singleAccountMultiRegions.
        public let sourceType: String?
        /// The data type name for including resource data sync state. There are four sync states:  OrganizationNotExists: Your organization doesn't exist.  NoPermissions: The system can't locate the service-linked role. This role is automatically created when a user creates a resource data sync in Explorer.  InvalidOrganizationalUnit: You specified or selected an invalid unit in the resource data sync configuration.  TrustedAccessDisabled: You disabled Systems Manager access in the organization in Organizations.
        public let state: String?

        @inlinable
        public init(awsOrganizationsSource: ResourceDataSyncAwsOrganizationsSource? = nil, enableAllOpsDataSources: Bool? = nil, includeFutureRegions: Bool? = nil, sourceRegions: [String]? = nil, sourceType: String? = nil, state: String? = nil) {
            self.awsOrganizationsSource = awsOrganizationsSource
            self.enableAllOpsDataSources = enableAllOpsDataSources
            self.includeFutureRegions = includeFutureRegions
            self.sourceRegions = sourceRegions
            self.sourceType = sourceType
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case awsOrganizationsSource = "AwsOrganizationsSource"
            case enableAllOpsDataSources = "EnableAllOpsDataSources"
            case includeFutureRegions = "IncludeFutureRegions"
            case sourceRegions = "SourceRegions"
            case sourceType = "SourceType"
            case state = "State"
        }
    }

    public struct ResourcePolicyInvalidParameterException: AWSErrorShape {
        public let message: String?
        public let parameterNames: [String]?

        @inlinable
        public init(message: String? = nil, parameterNames: [String]? = nil) {
            self.message = message
            self.parameterNames = parameterNames
        }

        private enum CodingKeys: String, CodingKey {
            case message = "Message"
            case parameterNames = "ParameterNames"
        }
    }

    public struct ResourcePolicyLimitExceededException: AWSErrorShape {
        public let limit: Int?
        public let limitType: String?
        public let message: String?

        @inlinable
        public init(limit: Int? = nil, limitType: String? = nil, message: String? = nil) {
            self.limit = limit
            self.limitType = limitType
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case limit = "Limit"
            case limitType = "LimitType"
            case message = "Message"
        }
    }

    public struct ResultAttribute: AWSEncodableShape {
        /// Name of the inventory item type. Valid value: AWS:InstanceInformation. Default Value: AWS:InstanceInformation.
        public let typeName: String

        @inlinable
        public init(typeName: String) {
            self.typeName = typeName
        }

        public func validate(name: String) throws {
            try self.validate(self.typeName, name: "typeName", parent: name, max: 100)
            try self.validate(self.typeName, name: "typeName", parent: name, min: 1)
            try self.validate(self.typeName, name: "typeName", parent: name, pattern: "^(AWS|Custom):.*$")
        }

        private enum CodingKeys: String, CodingKey {
            case typeName = "TypeName"
        }
    }

    public struct ResumeSessionRequest: AWSEncodableShape {
        /// The ID of the disconnected session to resume.
        public let sessionId: String

        @inlinable
        public init(sessionId: String) {
            self.sessionId = sessionId
        }

        public func validate(name: String) throws {
            try self.validate(self.sessionId, name: "sessionId", parent: name, max: 96)
            try self.validate(self.sessionId, name: "sessionId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case sessionId = "SessionId"
        }
    }

    public struct ResumeSessionResponse: AWSDecodableShape {
        /// The ID of the session.
        public let sessionId: String?
        /// A URL back to SSM Agent on the managed node that the Session Manager client uses to send commands and receive output from the managed node. Format: wss://ssmmessages.region.amazonaws.com/v1/data-channel/session-id?stream=(input|output).  region represents the Region identifier for an
        /// 						Amazon Web Services Region supported by Amazon Web Services Systems Manager, such as us-east-2 for the US East (Ohio) Region.
        /// 						For a list of supported region values, see the Region column in Systems Manager service endpoints in the Amazon Web Services General Reference.  session-id represents the ID of a Session Manager session, such as 1a2b3c4dEXAMPLE.
        public let streamUrl: String?
        /// An encrypted token value containing session and caller information. Used to authenticate the connection to the managed node.
        public let tokenValue: String?

        @inlinable
        public init(sessionId: String? = nil, streamUrl: String? = nil, tokenValue: String? = nil) {
            self.sessionId = sessionId
            self.streamUrl = streamUrl
            self.tokenValue = tokenValue
        }

        private enum CodingKeys: String, CodingKey {
            case sessionId = "SessionId"
            case streamUrl = "StreamUrl"
            case tokenValue = "TokenValue"
        }
    }

    public struct ReviewInformation: AWSDecodableShape {
        /// The time that the reviewer took action on the document review request.
        public let reviewedTime: Date?
        /// The reviewer assigned to take action on the document review request.
        public let reviewer: String?
        /// The current status of the document review request.
        public let status: ReviewStatus?

        @inlinable
        public init(reviewedTime: Date? = nil, reviewer: String? = nil, status: ReviewStatus? = nil) {
            self.reviewedTime = reviewedTime
            self.reviewer = reviewer
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case reviewedTime = "ReviewedTime"
            case reviewer = "Reviewer"
            case status = "Status"
        }
    }

    public struct Runbook: AWSEncodableShape & AWSDecodableShape {
        /// The name of the Automation runbook used in a runbook workflow.
        public let documentName: String
        /// The version of the Automation runbook used in a runbook workflow.
        public let documentVersion: String?
        /// The MaxConcurrency value specified by the user when the operation started, indicating the maximum number of resources that the runbook operation can run on at the same time.
        public let maxConcurrency: String?
        /// The MaxErrors value specified by the user when the execution started, indicating the maximum number of errors that can occur during the operation before the updates are stopped or rolled back.
        public let maxErrors: String?
        /// The key-value map of execution parameters, which were supplied when calling StartChangeRequestExecution.
        public let parameters: [String: [String]]?
        /// Information about the Amazon Web Services Regions and Amazon Web Services accounts targeted by the current Runbook operation.
        public let targetLocations: [TargetLocation]?
        /// A key-value mapping of runbook parameters to target resources. Both Targets and TargetMaps can't be specified together.
        public let targetMaps: [[String: [String]]]?
        /// The name of the parameter used as the target resource for the rate-controlled runbook workflow. Required if you specify Targets.
        public let targetParameterName: String?
        /// A key-value mapping to target resources that the runbook operation performs tasks on. Required if you specify TargetParameterName.
        public let targets: [Target]?

        @inlinable
        public init(documentName: String, documentVersion: String? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, parameters: [String: [String]]? = nil, targetLocations: [TargetLocation]? = nil, targetMaps: [[String: [String]]]? = nil, targetParameterName: String? = nil, targets: [Target]? = nil) {
            self.documentName = documentName
            self.documentVersion = documentVersion
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.parameters = parameters
            self.targetLocations = targetLocations
            self.targetMaps = targetMaps
            self.targetParameterName = targetParameterName
            self.targets = targets
        }

        public func validate(name: String) throws {
            try self.validate(self.documentName, name: "documentName", parent: name, pattern: "^[a-zA-Z0-9_\\-.:/]{3,128}$")
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, max: 7)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, min: 1)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, pattern: "^([1-9][0-9]*|[1-9][0-9]%|[1-9]%|100%)$")
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, max: 7)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, min: 1)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, pattern: "^([1-9][0-9]*|[0]|[1-9][0-9]%|[0-9]%|100%)$")
            try self.parameters?.forEach {
                try validate($0.key, name: "parameters.key", parent: name, max: 50)
                try validate($0.key, name: "parameters.key", parent: name, min: 1)
                try validate($0.value, name: "parameters[\"\($0.key)\"]", parent: name, max: 50)
            }
            try self.validate(self.parameters, name: "parameters", parent: name, max: 200)
            try self.validate(self.parameters, name: "parameters", parent: name, min: 1)
            try self.targetLocations?.forEach {
                try $0.validate(name: "\(name).targetLocations[]")
            }
            try self.validate(self.targetLocations, name: "targetLocations", parent: name, max: 100)
            try self.validate(self.targetLocations, name: "targetLocations", parent: name, min: 1)
            try self.targetMaps?.forEach {
                try validate($0, name: "targetMaps[]", parent: name, max: 20)
                try validate($0, name: "targetMaps[]", parent: name, min: 1)
            }
            try self.validate(self.targetMaps, name: "targetMaps", parent: name, max: 300)
            try self.validate(self.targetParameterName, name: "targetParameterName", parent: name, max: 50)
            try self.validate(self.targetParameterName, name: "targetParameterName", parent: name, min: 1)
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
            try self.validate(self.targets, name: "targets", parent: name, max: 5)
        }

        private enum CodingKeys: String, CodingKey {
            case documentName = "DocumentName"
            case documentVersion = "DocumentVersion"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case parameters = "Parameters"
            case targetLocations = "TargetLocations"
            case targetMaps = "TargetMaps"
            case targetParameterName = "TargetParameterName"
            case targets = "Targets"
        }
    }

    public struct S3OutputLocation: AWSEncodableShape & AWSDecodableShape {
        /// The name of the S3 bucket.
        public let outputS3BucketName: String?
        /// The S3 bucket subfolder.
        public let outputS3KeyPrefix: String?
        /// The Amazon Web Services Region of the S3 bucket.
        public let outputS3Region: String?

        @inlinable
        public init(outputS3BucketName: String? = nil, outputS3KeyPrefix: String? = nil, outputS3Region: String? = nil) {
            self.outputS3BucketName = outputS3BucketName
            self.outputS3KeyPrefix = outputS3KeyPrefix
            self.outputS3Region = outputS3Region
        }

        public func validate(name: String) throws {
            try self.validate(self.outputS3BucketName, name: "outputS3BucketName", parent: name, max: 63)
            try self.validate(self.outputS3BucketName, name: "outputS3BucketName", parent: name, min: 3)
            try self.validate(self.outputS3KeyPrefix, name: "outputS3KeyPrefix", parent: name, max: 500)
            try self.validate(self.outputS3Region, name: "outputS3Region", parent: name, max: 20)
            try self.validate(self.outputS3Region, name: "outputS3Region", parent: name, min: 3)
        }

        private enum CodingKeys: String, CodingKey {
            case outputS3BucketName = "OutputS3BucketName"
            case outputS3KeyPrefix = "OutputS3KeyPrefix"
            case outputS3Region = "OutputS3Region"
        }
    }

    public struct S3OutputUrl: AWSDecodableShape {
        /// A URL for an S3 bucket where you want to store the results of this request.
        public let outputUrl: String?

        @inlinable
        public init(outputUrl: String? = nil) {
            self.outputUrl = outputUrl
        }

        private enum CodingKeys: String, CodingKey {
            case outputUrl = "OutputUrl"
        }
    }

    public struct ScheduledWindowExecution: AWSDecodableShape {
        /// The time, in ISO-8601 Extended format, that the maintenance window is scheduled to be run.
        public let executionTime: String?
        /// The name of the maintenance window to be run.
        public let name: String?
        /// The ID of the maintenance window to be run.
        public let windowId: String?

        @inlinable
        public init(executionTime: String? = nil, name: String? = nil, windowId: String? = nil) {
            self.executionTime = executionTime
            self.name = name
            self.windowId = windowId
        }

        private enum CodingKeys: String, CodingKey {
            case executionTime = "ExecutionTime"
            case name = "Name"
            case windowId = "WindowId"
        }
    }

    public struct SendAutomationSignalRequest: AWSEncodableShape {
        /// The unique identifier for an existing Automation execution that you want to send the signal to.
        public let automationExecutionId: String
        /// The data sent with the signal. The data schema depends on the type of signal used in the request. For Approve and Reject signal types, the payload is an optional comment that you can send with the signal type. For example:  Comment="Looks good"  For StartStep and Resume signal types, you must send the name of the Automation step to start or resume as the payload. For example:  StepName="step1"  For the StopStep signal type, you must send the step execution ID as the payload. For example:  StepExecutionId="97fff367-fc5a-4299-aed8-0123456789ab"
        public let payload: [String: [String]]?
        /// The type of signal to send to an Automation execution.
        public let signalType: SignalType

        @inlinable
        public init(automationExecutionId: String, payload: [String: [String]]? = nil, signalType: SignalType) {
            self.automationExecutionId = automationExecutionId
            self.payload = payload
            self.signalType = signalType
        }

        public func validate(name: String) throws {
            try self.validate(self.automationExecutionId, name: "automationExecutionId", parent: name, max: 36)
            try self.validate(self.automationExecutionId, name: "automationExecutionId", parent: name, min: 36)
            try self.payload?.forEach {
                try validate($0.key, name: "payload.key", parent: name, max: 50)
                try validate($0.key, name: "payload.key", parent: name, min: 1)
                try validate($0.value, name: "payload[\"\($0.key)\"]", parent: name, max: 50)
            }
            try self.validate(self.payload, name: "payload", parent: name, max: 200)
            try self.validate(self.payload, name: "payload", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case automationExecutionId = "AutomationExecutionId"
            case payload = "Payload"
            case signalType = "SignalType"
        }
    }

    public struct SendAutomationSignalResult: AWSDecodableShape {
        public init() {}
    }

    public struct SendCommandRequest: AWSEncodableShape {
        /// The CloudWatch alarm you want to apply to your command.
        public let alarmConfiguration: AlarmConfiguration?
        /// Enables Amazon Web Services Systems Manager to send Run Command output to Amazon CloudWatch Logs. Run Command is a tool in Amazon Web Services Systems Manager.
        public let cloudWatchOutputConfig: CloudWatchOutputConfig?
        /// User-specified information about the command, such as a brief description of what the command should do.
        public let comment: String?
        /// The Sha256 or Sha1 hash created by the system when the document was created.   Sha1 hashes have been deprecated.
        public let documentHash: String?
        /// Sha256 or Sha1.  Sha1 hashes have been deprecated.
        public let documentHashType: DocumentHashType?
        /// The name of the Amazon Web Services Systems Manager document (SSM document) to run. This can be a public document or a custom document. To run a shared document belonging to another account, specify the document Amazon Resource Name (ARN). For more information about how to use shared documents, see Sharing SSM documents in the Amazon Web Services Systems Manager User Guide.  If you specify a document name or ARN that hasn't been shared with your account, you receive an InvalidDocument error.
        public let documentName: String
        /// The SSM document version to use in the request. You can specify $DEFAULT, $LATEST, or a specific version number. If you run commands by using the Command Line Interface (Amazon Web Services CLI), then you must escape the first two options by using a backslash. If you specify a version number, then you don't need to use the backslash. For example: --document-version "\$DEFAULT" --document-version "\$LATEST" --document-version "3"
        public let documentVersion: String?
        /// The IDs of the managed nodes where the command should run. Specifying managed node IDs is most useful when you are targeting a limited number of managed nodes, though you can specify up to 50 IDs. To target a larger number of managed nodes, or if you prefer not to list individual node IDs, we recommend using the Targets option instead. Using Targets, which accepts tag key-value pairs to identify the managed nodes to send commands to, you can a send command to tens, hundreds, or thousands of nodes at once. For more information about how to use targets, see Run commands at scale in the Amazon Web Services Systems Manager User Guide.
        public let instanceIds: [String]?
        /// (Optional) The maximum number of managed nodes that are allowed to run the command at the same time. You can specify a number such as 10 or a percentage such as 10%. The default value is 50. For more information about how to use MaxConcurrency, see Using concurrency controls in the Amazon Web Services Systems Manager User Guide.
        public let maxConcurrency: String?
        /// The maximum number of errors allowed without the command failing. When the command fails one more time beyond the value of MaxErrors, the systems stops sending the command to additional targets. You can specify a number like 10 or a percentage like 10%. The default value is 0. For more information about how to use MaxErrors, see Using error controls in the Amazon Web Services Systems Manager User Guide.
        public let maxErrors: String?
        /// Configurations for sending notifications.
        public let notificationConfig: NotificationConfig?
        /// The name of the S3 bucket where command execution responses should be stored.
        public let outputS3BucketName: String?
        /// The directory structure within the S3 bucket where the responses should be stored.
        public let outputS3KeyPrefix: String?
        /// (Deprecated) You can no longer specify this parameter. The system ignores it. Instead, Systems Manager automatically determines the Amazon Web Services Region of the S3 bucket.
        public let outputS3Region: String?
        /// The required and optional parameters specified in the document being run.
        public let parameters: [String: [String]]?
        /// The ARN of the Identity and Access Management (IAM) service role to use to publish Amazon Simple Notification Service (Amazon SNS) notifications for Run Command commands. This role must provide the sns:Publish permission for your notification topic. For information about creating and using this service role, see Monitoring Systems Manager status changes using Amazon SNS notifications in the Amazon Web Services Systems Manager User Guide.
        public let serviceRoleArn: String?
        /// An array of search criteria that targets managed nodes using a Key,Value combination that you specify. Specifying targets is most useful when you want to send a command to a large number of managed nodes at once. Using Targets, which accepts tag key-value pairs to identify managed nodes, you can send a command to tens, hundreds, or thousands of nodes at once. To send a command to a smaller number of managed nodes, you can use the InstanceIds option instead. For more information about how to use targets, see Run commands at scale in the Amazon Web Services Systems Manager User Guide.
        public let targets: [Target]?
        /// If this time is reached and the command hasn't already started running, it won't run.
        public let timeoutSeconds: Int?

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, cloudWatchOutputConfig: CloudWatchOutputConfig? = nil, comment: String? = nil, documentHash: String? = nil, documentHashType: DocumentHashType? = nil, documentName: String, documentVersion: String? = nil, instanceIds: [String]? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, notificationConfig: NotificationConfig? = nil, outputS3BucketName: String? = nil, outputS3KeyPrefix: String? = nil, outputS3Region: String? = nil, parameters: [String: [String]]? = nil, serviceRoleArn: String? = nil, targets: [Target]? = nil, timeoutSeconds: Int? = nil) {
            self.alarmConfiguration = alarmConfiguration
            self.cloudWatchOutputConfig = cloudWatchOutputConfig
            self.comment = comment
            self.documentHash = documentHash
            self.documentHashType = documentHashType
            self.documentName = documentName
            self.documentVersion = documentVersion
            self.instanceIds = instanceIds
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.notificationConfig = notificationConfig
            self.outputS3BucketName = outputS3BucketName
            self.outputS3KeyPrefix = outputS3KeyPrefix
            self.outputS3Region = outputS3Region
            self.parameters = parameters
            self.serviceRoleArn = serviceRoleArn
            self.targets = targets
            self.timeoutSeconds = timeoutSeconds
        }

        public func validate(name: String) throws {
            try self.alarmConfiguration?.validate(name: "\(name).alarmConfiguration")
            try self.cloudWatchOutputConfig?.validate(name: "\(name).cloudWatchOutputConfig")
            try self.validate(self.comment, name: "comment", parent: name, max: 100)
            try self.validate(self.documentHash, name: "documentHash", parent: name, max: 256)
            try self.validate(self.documentName, name: "documentName", parent: name, pattern: "^[a-zA-Z0-9_\\-.:/]{3,128}$")
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.instanceIds?.forEach {
                try validate($0, name: "instanceIds[]", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            }
            try self.validate(self.instanceIds, name: "instanceIds", parent: name, max: 50)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, max: 7)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, min: 1)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, pattern: "^([1-9][0-9]*|[1-9][0-9]%|[1-9]%|100%)$")
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, max: 7)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, min: 1)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, pattern: "^([1-9][0-9]*|[0]|[1-9][0-9]%|[0-9]%|100%)$")
            try self.validate(self.outputS3BucketName, name: "outputS3BucketName", parent: name, max: 63)
            try self.validate(self.outputS3BucketName, name: "outputS3BucketName", parent: name, min: 3)
            try self.validate(self.outputS3KeyPrefix, name: "outputS3KeyPrefix", parent: name, max: 500)
            try self.validate(self.outputS3Region, name: "outputS3Region", parent: name, max: 20)
            try self.validate(self.outputS3Region, name: "outputS3Region", parent: name, min: 3)
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
            try self.validate(self.targets, name: "targets", parent: name, max: 5)
            try self.validate(self.timeoutSeconds, name: "timeoutSeconds", parent: name, max: 2592000)
            try self.validate(self.timeoutSeconds, name: "timeoutSeconds", parent: name, min: 30)
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case cloudWatchOutputConfig = "CloudWatchOutputConfig"
            case comment = "Comment"
            case documentHash = "DocumentHash"
            case documentHashType = "DocumentHashType"
            case documentName = "DocumentName"
            case documentVersion = "DocumentVersion"
            case instanceIds = "InstanceIds"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case notificationConfig = "NotificationConfig"
            case outputS3BucketName = "OutputS3BucketName"
            case outputS3KeyPrefix = "OutputS3KeyPrefix"
            case outputS3Region = "OutputS3Region"
            case parameters = "Parameters"
            case serviceRoleArn = "ServiceRoleArn"
            case targets = "Targets"
            case timeoutSeconds = "TimeoutSeconds"
        }
    }

    public struct SendCommandResult: AWSDecodableShape {
        /// The request as it was received by Systems Manager. Also provides the command ID which can be used future references to this request.
        public let command: Command?

        @inlinable
        public init(command: Command? = nil) {
            self.command = command
        }

        private enum CodingKeys: String, CodingKey {
            case command = "Command"
        }
    }

    public struct ServiceQuotaExceededException: AWSErrorShape {
        public let message: String
        /// The quota code recognized by the Amazon Web Services Service Quotas service.
        public let quotaCode: String
        /// The unique ID of the resource referenced in the failed request.
        public let resourceId: String?
        /// The resource type of the resource referenced in the failed request.
        public let resourceType: String?
        /// The code for the Amazon Web Services service that owns the quota.
        public let serviceCode: String

        @inlinable
        public init(message: String, quotaCode: String, resourceId: String? = nil, resourceType: String? = nil, serviceCode: String) {
            self.message = message
            self.quotaCode = quotaCode
            self.resourceId = resourceId
            self.resourceType = resourceType
            self.serviceCode = serviceCode
        }

        private enum CodingKeys: String, CodingKey {
            case message = "Message"
            case quotaCode = "QuotaCode"
            case resourceId = "ResourceId"
            case resourceType = "ResourceType"
            case serviceCode = "ServiceCode"
        }
    }

    public struct ServiceSetting: AWSDecodableShape {
        /// The ARN of the service setting.
        public let arn: String?
        /// The last time the service setting was modified.
        public let lastModifiedDate: Date?
        /// The ARN of the last modified user. This field is populated only if the setting value was overwritten.
        public let lastModifiedUser: String?
        /// The ID of the service setting.
        public let settingId: String?
        /// The value of the service setting.
        public let settingValue: String?
        /// The status of the service setting. The value can be Default, Customized or PendingUpdate.   Default: The current setting uses a default value provisioned by the Amazon Web Services service team.   Customized: The current setting use a custom value specified by the customer.   PendingUpdate: The current setting uses a default or custom value, but a setting change request is pending approval.
        public let status: String?

        @inlinable
        public init(arn: String? = nil, lastModifiedDate: Date? = nil, lastModifiedUser: String? = nil, settingId: String? = nil, settingValue: String? = nil, status: String? = nil) {
            self.arn = arn
            self.lastModifiedDate = lastModifiedDate
            self.lastModifiedUser = lastModifiedUser
            self.settingId = settingId
            self.settingValue = settingValue
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "ARN"
            case lastModifiedDate = "LastModifiedDate"
            case lastModifiedUser = "LastModifiedUser"
            case settingId = "SettingId"
            case settingValue = "SettingValue"
            case status = "Status"
        }
    }

    public struct Session: AWSDecodableShape {
        ///  Standard access type is the default for Session Manager sessions. JustInTime is the access type for Just-in-time node access.
        public let accessType: AccessType?
        /// Reserved for future use.
        public let details: String?
        /// The name of the Session Manager SSM document used to define the parameters and plugin settings for the session. For example, SSM-SessionManagerRunShell.
        public let documentName: String?
        /// The date and time, in ISO-8601 Extended format, when the session was terminated.
        public let endDate: Date?
        /// The maximum duration of a session before it terminates.
        public let maxSessionDuration: String?
        /// Reserved for future use.
        public let outputUrl: SessionManagerOutputUrl?
        /// The ID of the Amazon Web Services user that started the session.
        public let owner: String?
        /// The reason for connecting to the instance.
        public let reason: String?
        /// The ID of the session.
        public let sessionId: String?
        /// The date and time, in ISO-8601 Extended format, when the session began.
        public let startDate: Date?
        /// The status of the session. For example, "Connected" or "Terminated".
        public let status: SessionStatus?
        /// The managed node that the Session Manager session connected to.
        public let target: String?

        @inlinable
        public init(accessType: AccessType? = nil, details: String? = nil, documentName: String? = nil, endDate: Date? = nil, maxSessionDuration: String? = nil, outputUrl: SessionManagerOutputUrl? = nil, owner: String? = nil, reason: String? = nil, sessionId: String? = nil, startDate: Date? = nil, status: SessionStatus? = nil, target: String? = nil) {
            self.accessType = accessType
            self.details = details
            self.documentName = documentName
            self.endDate = endDate
            self.maxSessionDuration = maxSessionDuration
            self.outputUrl = outputUrl
            self.owner = owner
            self.reason = reason
            self.sessionId = sessionId
            self.startDate = startDate
            self.status = status
            self.target = target
        }

        private enum CodingKeys: String, CodingKey {
            case accessType = "AccessType"
            case details = "Details"
            case documentName = "DocumentName"
            case endDate = "EndDate"
            case maxSessionDuration = "MaxSessionDuration"
            case outputUrl = "OutputUrl"
            case owner = "Owner"
            case reason = "Reason"
            case sessionId = "SessionId"
            case startDate = "StartDate"
            case status = "Status"
            case target = "Target"
        }
    }

    public struct SessionFilter: AWSEncodableShape {
        /// The name of the filter.
        public let key: SessionFilterKey
        /// The filter value. Valid values for each filter key are as follows:   InvokedAfter: Specify a timestamp to limit your results. For example, specify 2024-08-29T00:00:00Z to see sessions that started August 29, 2024, and later.   InvokedBefore: Specify a timestamp to limit your results. For example, specify 2024-08-29T00:00:00Z to see sessions that started before August 29, 2024.   Target: Specify a managed node to which session connections have been made.   Owner: Specify an Amazon Web Services user to see a list of sessions started by that user.   Status: Specify a valid session status to see a list of all sessions with that status. Status values you can specify include:   Connected   Connecting   Disconnected   Terminated   Terminating   Failed     SessionId: Specify a session ID to return details about the session.
        public let value: String

        @inlinable
        public init(key: SessionFilterKey, value: String) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.value, name: "value", parent: name, max: 400)
            try self.validate(self.value, name: "value", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "key"
            case value = "value"
        }
    }

    public struct SessionManagerOutputUrl: AWSDecodableShape {
        /// Reserved for future use.
        public let cloudWatchOutputUrl: String?
        /// Reserved for future use.
        public let s3OutputUrl: String?

        @inlinable
        public init(cloudWatchOutputUrl: String? = nil, s3OutputUrl: String? = nil) {
            self.cloudWatchOutputUrl = cloudWatchOutputUrl
            self.s3OutputUrl = s3OutputUrl
        }

        private enum CodingKeys: String, CodingKey {
            case cloudWatchOutputUrl = "CloudWatchOutputUrl"
            case s3OutputUrl = "S3OutputUrl"
        }
    }

    public struct SeveritySummary: AWSDecodableShape {
        /// The total number of resources or compliance items that have a severity level of Critical. Critical severity is determined by the organization that published the compliance items.
        public let criticalCount: Int?
        /// The total number of resources or compliance items that have a severity level of high. High severity is determined by the organization that published the compliance items.
        public let highCount: Int?
        /// The total number of resources or compliance items that have a severity level of informational. Informational severity is determined by the organization that published the compliance items.
        public let informationalCount: Int?
        /// The total number of resources or compliance items that have a severity level of low. Low severity is determined by the organization that published the compliance items.
        public let lowCount: Int?
        /// The total number of resources or compliance items that have a severity level of medium. Medium severity is determined by the organization that published the compliance items.
        public let mediumCount: Int?
        /// The total number of resources or compliance items that have a severity level of unspecified. Unspecified severity is determined by the organization that published the compliance items.
        public let unspecifiedCount: Int?

        @inlinable
        public init(criticalCount: Int? = nil, highCount: Int? = nil, informationalCount: Int? = nil, lowCount: Int? = nil, mediumCount: Int? = nil, unspecifiedCount: Int? = nil) {
            self.criticalCount = criticalCount
            self.highCount = highCount
            self.informationalCount = informationalCount
            self.lowCount = lowCount
            self.mediumCount = mediumCount
            self.unspecifiedCount = unspecifiedCount
        }

        private enum CodingKeys: String, CodingKey {
            case criticalCount = "CriticalCount"
            case highCount = "HighCount"
            case informationalCount = "InformationalCount"
            case lowCount = "LowCount"
            case mediumCount = "MediumCount"
            case unspecifiedCount = "UnspecifiedCount"
        }
    }

    public struct StartAccessRequestRequest: AWSEncodableShape {
        /// A brief description explaining why you are requesting access to the node.
        public let reason: String
        /// Key-value pairs of metadata you want to assign to the access request.
        public let tags: [Tag]?
        /// The node you are requesting access to.
        public let targets: [Target]

        @inlinable
        public init(reason: String, tags: [Tag]? = nil, targets: [Target]) {
            self.reason = reason
            self.tags = tags
            self.targets = targets
        }

        public func validate(name: String) throws {
            try self.validate(self.reason, name: "reason", parent: name, max: 256)
            try self.validate(self.reason, name: "reason", parent: name, min: 1)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 1000)
            try self.targets.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
            try self.validate(self.targets, name: "targets", parent: name, max: 5)
        }

        private enum CodingKeys: String, CodingKey {
            case reason = "Reason"
            case tags = "Tags"
            case targets = "Targets"
        }
    }

    public struct StartAccessRequestResponse: AWSDecodableShape {
        /// The ID of the access request.
        public let accessRequestId: String?

        @inlinable
        public init(accessRequestId: String? = nil) {
            self.accessRequestId = accessRequestId
        }

        private enum CodingKeys: String, CodingKey {
            case accessRequestId = "AccessRequestId"
        }
    }

    public struct StartAssociationsOnceRequest: AWSEncodableShape {
        /// The association IDs that you want to run immediately and only one time.
        public let associationIds: [String]

        @inlinable
        public init(associationIds: [String]) {
            self.associationIds = associationIds
        }

        public func validate(name: String) throws {
            try self.associationIds.forEach {
                try validate($0, name: "associationIds[]", parent: name, pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")
            }
            try self.validate(self.associationIds, name: "associationIds", parent: name, max: 10)
            try self.validate(self.associationIds, name: "associationIds", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case associationIds = "AssociationIds"
        }
    }

    public struct StartAssociationsOnceResult: AWSDecodableShape {
        public init() {}
    }

    public struct StartAutomationExecutionRequest: AWSEncodableShape {
        /// The CloudWatch alarm you want to apply to your automation.
        public let alarmConfiguration: AlarmConfiguration?
        /// User-provided idempotency token. The token must be unique, is case insensitive, enforces the UUID format, and can't be reused.
        public let clientToken: String?
        /// The name of the SSM document to run. This can be a public document or a custom document. To run a shared document belonging to another account, specify the document ARN. For more information about how to use shared documents, see Sharing SSM documents in the Amazon Web Services Systems Manager User Guide.
        public let documentName: String
        /// The version of the Automation runbook to use for this execution.
        public let documentVersion: String?
        /// The maximum number of targets allowed to run this task in parallel. You can specify a number, such as 10, or a percentage, such as 10%. The default value is 10. If both this parameter and the TargetLocation:TargetsMaxConcurrency are supplied, TargetLocation:TargetsMaxConcurrency takes precedence.
        public let maxConcurrency: String?
        /// The number of errors that are allowed before the system stops running the automation on additional targets. You can specify either an absolute number of errors, for example 10, or a percentage of the target set, for example 10%. If you specify 3, for example, the system stops running the automation when the fourth error is received. If you specify 0, then the system stops running the automation on additional targets after the first error result is returned. If you run an automation on 50 resources and set max-errors to 10%, then the system stops running the automation on additional targets when the sixth error is received. Executions that are already running an automation when max-errors is reached are allowed to complete, but some of these executions may fail as well. If you need to ensure that there won't be more than max-errors failed executions, set max-concurrency to 1 so the executions proceed one at a time. If this parameter and the TargetLocation:TargetsMaxErrors parameter are both supplied, TargetLocation:TargetsMaxErrors takes precedence.
        public let maxErrors: String?
        /// The execution mode of the automation. Valid modes include the following: Auto and Interactive. The default mode is Auto.
        public let mode: ExecutionMode?
        /// A key-value map of execution parameters, which match the declared parameters in the Automation runbook.
        public let parameters: [String: [String]]?
        /// Optional metadata that you assign to a resource. You can specify a maximum of five tags for an automation. Tags enable you to categorize a resource in different ways, such as by purpose, owner, or environment. For example, you might want to tag an automation to identify an environment or operating system. In this case, you could specify the following key-value pairs:    Key=environment,Value=test     Key=OS,Value=Windows     The Array Members maximum value is reported as 1000. This number includes capacity reserved for internal operations. When calling the StartAutomationExecution action, you can specify a maximum of 5 tags. You can, however, use the AddTagsToResource action to add up to a total of 50 tags to an existing automation configuration.
        public let tags: [Tag]?
        /// A location is a combination of Amazon Web Services Regions and/or Amazon Web Services accounts where you want to run the automation. Use this operation to start an automation in multiple Amazon Web Services Regions and multiple Amazon Web Services accounts. For more information, see Running automations in multiple Amazon Web Services Regions and accounts in the Amazon Web Services Systems Manager User Guide.
        public let targetLocations: [TargetLocation]?
        /// Specify a publicly accessible URL for a file that contains the TargetLocations body. Currently, only files in presigned Amazon S3 buckets are supported.
        public let targetLocationsURL: String?
        /// A key-value mapping of document parameters to target resources. Both Targets and TargetMaps can't be specified together.
        public let targetMaps: [[String: [String]]]?
        /// The name of the parameter used as the target resource for the rate-controlled execution. Required if you specify targets.
        public let targetParameterName: String?
        /// A key-value mapping to target resources. Required if you specify TargetParameterName. If both this parameter and the TargetLocation:Targets parameter are supplied, TargetLocation:Targets takes precedence.
        public let targets: [Target]?

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, clientToken: String? = nil, documentName: String, documentVersion: String? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, mode: ExecutionMode? = nil, parameters: [String: [String]]? = nil, tags: [Tag]? = nil, targetLocations: [TargetLocation]? = nil, targetLocationsURL: String? = nil, targetMaps: [[String: [String]]]? = nil, targetParameterName: String? = nil, targets: [Target]? = nil) {
            self.alarmConfiguration = alarmConfiguration
            self.clientToken = clientToken
            self.documentName = documentName
            self.documentVersion = documentVersion
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.mode = mode
            self.parameters = parameters
            self.tags = tags
            self.targetLocations = targetLocations
            self.targetLocationsURL = targetLocationsURL
            self.targetMaps = targetMaps
            self.targetParameterName = targetParameterName
            self.targets = targets
        }

        public func validate(name: String) throws {
            try self.alarmConfiguration?.validate(name: "\(name).alarmConfiguration")
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 36)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 36)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$")
            try self.validate(self.documentName, name: "documentName", parent: name, pattern: "^[a-zA-Z0-9_\\-.:/]{3,128}$")
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, max: 7)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, min: 1)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, pattern: "^([1-9][0-9]*|[1-9][0-9]%|[1-9]%|100%)$")
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, max: 7)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, min: 1)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, pattern: "^([1-9][0-9]*|[0]|[1-9][0-9]%|[0-9]%|100%)$")
            try self.parameters?.forEach {
                try validate($0.key, name: "parameters.key", parent: name, max: 50)
                try validate($0.key, name: "parameters.key", parent: name, min: 1)
                try validate($0.value, name: "parameters[\"\($0.key)\"]", parent: name, max: 50)
            }
            try self.validate(self.parameters, name: "parameters", parent: name, max: 200)
            try self.validate(self.parameters, name: "parameters", parent: name, min: 1)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 1000)
            try self.targetLocations?.forEach {
                try $0.validate(name: "\(name).targetLocations[]")
            }
            try self.validate(self.targetLocations, name: "targetLocations", parent: name, max: 100)
            try self.validate(self.targetLocations, name: "targetLocations", parent: name, min: 1)
            try self.validate(self.targetLocationsURL, name: "targetLocationsURL", parent: name, pattern: "^https:\\/\\/[-a-zA-Z0-9@:%._\\+~#=]{1,253}\\.s3(\\.[a-z\\d-]{9,16})?\\.amazonaws\\.com\\/.{1,2000}$")
            try self.targetMaps?.forEach {
                try validate($0, name: "targetMaps[]", parent: name, max: 20)
                try validate($0, name: "targetMaps[]", parent: name, min: 1)
            }
            try self.validate(self.targetMaps, name: "targetMaps", parent: name, max: 300)
            try self.validate(self.targetParameterName, name: "targetParameterName", parent: name, max: 50)
            try self.validate(self.targetParameterName, name: "targetParameterName", parent: name, min: 1)
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
            try self.validate(self.targets, name: "targets", parent: name, max: 5)
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case clientToken = "ClientToken"
            case documentName = "DocumentName"
            case documentVersion = "DocumentVersion"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case mode = "Mode"
            case parameters = "Parameters"
            case tags = "Tags"
            case targetLocations = "TargetLocations"
            case targetLocationsURL = "TargetLocationsURL"
            case targetMaps = "TargetMaps"
            case targetParameterName = "TargetParameterName"
            case targets = "Targets"
        }
    }

    public struct StartAutomationExecutionResult: AWSDecodableShape {
        /// The unique ID of a newly scheduled automation execution.
        public let automationExecutionId: String?

        @inlinable
        public init(automationExecutionId: String? = nil) {
            self.automationExecutionId = automationExecutionId
        }

        private enum CodingKeys: String, CodingKey {
            case automationExecutionId = "AutomationExecutionId"
        }
    }

    public struct StartChangeRequestExecutionRequest: AWSEncodableShape {
        /// Indicates whether the change request can be approved automatically without the need for manual approvals. If AutoApprovable is enabled in a change template, then setting AutoApprove to true in StartChangeRequestExecution creates a change request that bypasses approver review.  Change Calendar restrictions are not bypassed in this scenario. If the state of an associated calendar is CLOSED, change freeze approvers must still grant permission for this change request to run. If they don't, the change won't be processed until the calendar state is again OPEN.
        public let autoApprove: Bool?
        /// User-provided details about the change. If no details are provided, content specified in the Template information section of the associated change template is added.
        public let changeDetails: String?
        /// The name of the change request associated with the runbook workflow to be run.
        public let changeRequestName: String?
        /// The user-provided idempotency token. The token must be unique, is case insensitive, enforces the UUID format, and can't be reused.
        public let clientToken: String?
        /// The name of the change template document to run during the runbook workflow.
        public let documentName: String
        /// The version of the change template document to run during the runbook workflow.
        public let documentVersion: String?
        /// A key-value map of parameters that match the declared parameters in the change template document.
        public let parameters: [String: [String]]?
        /// Information about the Automation runbooks that are run during the runbook workflow.  The Automation runbooks specified for the runbook workflow can't run until all required approvals for the change request have been received.
        public let runbooks: [Runbook]
        /// The time that the requester expects the runbook workflow related to the change request to complete. The time is an estimate only that the requester provides for reviewers.
        public let scheduledEndTime: Date?
        /// The date and time specified in the change request to run the Automation runbooks.  The Automation runbooks specified for the runbook workflow can't run until all required approvals for the change request have been received.
        public let scheduledTime: Date?
        /// Optional metadata that you assign to a resource. You can specify a maximum of five tags for a change request. Tags enable you to categorize a resource in different ways, such as by purpose, owner, or environment. For example, you might want to tag a change request to identify an environment or target Amazon Web Services Region. In this case, you could specify the following key-value pairs:    Key=Environment,Value=Production     Key=Region,Value=us-east-2     The Array Members maximum value is reported as 1000. This number includes capacity reserved for internal operations. When calling the StartChangeRequestExecution action, you can specify a maximum of 5 tags. You can, however, use the AddTagsToResource action to add up to a total of 50 tags to an existing change request configuration.
        public let tags: [Tag]?

        @inlinable
        public init(autoApprove: Bool? = nil, changeDetails: String? = nil, changeRequestName: String? = nil, clientToken: String? = nil, documentName: String, documentVersion: String? = nil, parameters: [String: [String]]? = nil, runbooks: [Runbook], scheduledEndTime: Date? = nil, scheduledTime: Date? = nil, tags: [Tag]? = nil) {
            self.autoApprove = autoApprove
            self.changeDetails = changeDetails
            self.changeRequestName = changeRequestName
            self.clientToken = clientToken
            self.documentName = documentName
            self.documentVersion = documentVersion
            self.parameters = parameters
            self.runbooks = runbooks
            self.scheduledEndTime = scheduledEndTime
            self.scheduledTime = scheduledTime
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.changeDetails, name: "changeDetails", parent: name, max: 32768)
            try self.validate(self.changeDetails, name: "changeDetails", parent: name, min: 1)
            try self.validate(self.changeRequestName, name: "changeRequestName", parent: name, max: 1024)
            try self.validate(self.changeRequestName, name: "changeRequestName", parent: name, min: 1)
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 36)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 36)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$")
            try self.validate(self.documentName, name: "documentName", parent: name, pattern: "^[a-zA-Z0-9_\\-.:/]{3,128}$")
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.parameters?.forEach {
                try validate($0.key, name: "parameters.key", parent: name, max: 50)
                try validate($0.key, name: "parameters.key", parent: name, min: 1)
                try validate($0.value, name: "parameters[\"\($0.key)\"]", parent: name, max: 50)
            }
            try self.validate(self.parameters, name: "parameters", parent: name, max: 200)
            try self.validate(self.parameters, name: "parameters", parent: name, min: 1)
            try self.runbooks.forEach {
                try $0.validate(name: "\(name).runbooks[]")
            }
            try self.validate(self.runbooks, name: "runbooks", parent: name, max: 1)
            try self.validate(self.runbooks, name: "runbooks", parent: name, min: 1)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 1000)
        }

        private enum CodingKeys: String, CodingKey {
            case autoApprove = "AutoApprove"
            case changeDetails = "ChangeDetails"
            case changeRequestName = "ChangeRequestName"
            case clientToken = "ClientToken"
            case documentName = "DocumentName"
            case documentVersion = "DocumentVersion"
            case parameters = "Parameters"
            case runbooks = "Runbooks"
            case scheduledEndTime = "ScheduledEndTime"
            case scheduledTime = "ScheduledTime"
            case tags = "Tags"
        }
    }

    public struct StartChangeRequestExecutionResult: AWSDecodableShape {
        /// The unique ID of a runbook workflow operation. (A runbook workflow is a type of Automation operation.)
        public let automationExecutionId: String?

        @inlinable
        public init(automationExecutionId: String? = nil) {
            self.automationExecutionId = automationExecutionId
        }

        private enum CodingKeys: String, CodingKey {
            case automationExecutionId = "AutomationExecutionId"
        }
    }

    public struct StartExecutionPreviewRequest: AWSEncodableShape {
        /// The name of the Automation runbook to run. The result of the execution preview indicates what the impact would be of running this runbook.
        public let documentName: String
        /// The version of the Automation runbook to run. The default value is $DEFAULT.
        public let documentVersion: String?
        /// Information about the inputs that can be specified for the preview operation.
        public let executionInputs: ExecutionInputs?

        @inlinable
        public init(documentName: String, documentVersion: String? = nil, executionInputs: ExecutionInputs? = nil) {
            self.documentName = documentName
            self.documentVersion = documentVersion
            self.executionInputs = executionInputs
        }

        public func validate(name: String) throws {
            try self.validate(self.documentName, name: "documentName", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.executionInputs?.validate(name: "\(name).executionInputs")
        }

        private enum CodingKeys: String, CodingKey {
            case documentName = "DocumentName"
            case documentVersion = "DocumentVersion"
            case executionInputs = "ExecutionInputs"
        }
    }

    public struct StartExecutionPreviewResponse: AWSDecodableShape {
        /// The ID of the execution preview generated by the system.
        public let executionPreviewId: String?

        @inlinable
        public init(executionPreviewId: String? = nil) {
            self.executionPreviewId = executionPreviewId
        }

        private enum CodingKeys: String, CodingKey {
            case executionPreviewId = "ExecutionPreviewId"
        }
    }

    public struct StartSessionRequest: AWSEncodableShape {
        /// The name of the SSM document you want to use to define the type of session, input parameters, or preferences for the session. For example, SSM-SessionManagerRunShell. You can call the GetDocument API to verify the document exists before attempting to start a session. If no document name is provided, a shell to the managed node is launched by default. For more information, see Start a session in the Amazon Web Services Systems Manager User Guide.
        public let documentName: String?
        /// The values you want to specify for the parameters defined in the Session document. For more information about these parameters, see Create a Session Manager preferences document in the Amazon Web Services Systems Manager User Guide.
        public let parameters: [String: [String]]?
        /// The reason for connecting to the instance. This value is included in the details for the Amazon CloudWatch Events event created when you start the session.
        public let reason: String?
        /// The managed node to connect to for the session.
        public let target: String

        @inlinable
        public init(documentName: String? = nil, parameters: [String: [String]]? = nil, reason: String? = nil, target: String) {
            self.documentName = documentName
            self.parameters = parameters
            self.reason = reason
            self.target = target
        }

        public func validate(name: String) throws {
            try self.validate(self.documentName, name: "documentName", parent: name, pattern: "^[a-zA-Z0-9_\\-.:/]{3,128}$")
            try self.parameters?.forEach {
                try validate($0.key, name: "parameters.key", parent: name, max: 255)
                try validate($0.key, name: "parameters.key", parent: name, min: 1)
            }
            try self.validate(self.reason, name: "reason", parent: name, max: 256)
            try self.validate(self.reason, name: "reason", parent: name, min: 1)
            try self.validate(self.reason, name: "reason", parent: name, pattern: "^.{1,256}$")
            try self.validate(self.target, name: "target", parent: name, max: 400)
            try self.validate(self.target, name: "target", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case documentName = "DocumentName"
            case parameters = "Parameters"
            case reason = "Reason"
            case target = "Target"
        }
    }

    public struct StartSessionResponse: AWSDecodableShape {
        /// The ID of the session.
        public let sessionId: String?
        /// A URL back to SSM Agent on the managed node that the Session Manager client uses to send commands and receive output from the node. Format: wss://ssmmessages.region.amazonaws.com/v1/data-channel/session-id?stream=(input|output)   region represents the Region identifier for an
        /// 						Amazon Web Services Region supported by Amazon Web Services Systems Manager, such as us-east-2 for the US East (Ohio) Region.
        /// 						For a list of supported region values, see the Region column in Systems Manager service endpoints in the Amazon Web Services General Reference.  session-id represents the ID of a Session Manager session, such as 1a2b3c4dEXAMPLE.
        public let streamUrl: String?
        /// An encrypted token value containing session and caller information. This token is used to authenticate the connection to the managed node, and is valid only long enough to ensure the connection is successful. Never share your session's token.
        public let tokenValue: String?

        @inlinable
        public init(sessionId: String? = nil, streamUrl: String? = nil, tokenValue: String? = nil) {
            self.sessionId = sessionId
            self.streamUrl = streamUrl
            self.tokenValue = tokenValue
        }

        private enum CodingKeys: String, CodingKey {
            case sessionId = "SessionId"
            case streamUrl = "StreamUrl"
            case tokenValue = "TokenValue"
        }
    }

    public struct StepExecution: AWSDecodableShape {
        /// The action this step performs. The action determines the behavior of the step.
        public let action: String?
        /// If a step has finished execution, this contains the time the execution ended. If the step hasn't yet concluded, this field isn't populated.
        public let executionEndTime: Date?
        /// If a step has begun execution, this contains the time the step started. If the step is in Pending status, this field isn't populated.
        public let executionStartTime: Date?
        /// Information about the Automation failure.
        public let failureDetails: FailureDetails?
        /// If a step failed, this message explains why the execution failed.
        public let failureMessage: String?
        /// Fully-resolved values passed into the step before execution.
        public let inputs: [String: String]?
        /// The flag which can be used to help decide whether the failure of current step leads to the Automation failure.
        public let isCritical: Bool?
        /// The flag which can be used to end automation no matter whether the step succeeds or fails.
        public let isEnd: Bool?
        /// The maximum number of tries to run the action of the step. The default value is 1.
        public let maxAttempts: Int?
        /// The next step after the step succeeds.
        public let nextStep: String?
        /// The action to take if the step fails. The default value is Abort.
        public let onFailure: String?
        /// Returned values from the execution of the step.
        public let outputs: [String: [String]]?
        /// A user-specified list of parameters to override when running a step.
        public let overriddenParameters: [String: [String]]?
        /// Information about the parent step.
        public let parentStepDetails: ParentStepDetails?
        /// A message associated with the response code for an execution.
        public let response: String?
        /// The response code returned by the execution of the step.
        public let responseCode: String?
        /// The unique ID of a step execution.
        public let stepExecutionId: String?
        /// The name of this execution step.
        public let stepName: String?
        /// The execution status for this step.
        public let stepStatus: AutomationExecutionStatus?
        /// The combination of Amazon Web Services Regions and Amazon Web Services accounts targeted by the current Automation execution.
        public let targetLocation: TargetLocation?
        /// The targets for the step execution.
        public let targets: [Target]?
        /// The timeout seconds of the step.
        public let timeoutSeconds: Int64?
        /// The CloudWatch alarms that were invoked by the automation.
        public let triggeredAlarms: [AlarmStateInformation]?
        /// Strategies used when step fails, we support Continue and Abort. Abort will fail the automation when the step fails. Continue will ignore the failure of current step and allow automation to run the next step. With conditional branching, we add step:stepName to support the automation to go to another specific step.
        public let validNextSteps: [String]?

        @inlinable
        public init(action: String? = nil, executionEndTime: Date? = nil, executionStartTime: Date? = nil, failureDetails: FailureDetails? = nil, failureMessage: String? = nil, inputs: [String: String]? = nil, isCritical: Bool? = nil, isEnd: Bool? = nil, maxAttempts: Int? = nil, nextStep: String? = nil, onFailure: String? = nil, outputs: [String: [String]]? = nil, overriddenParameters: [String: [String]]? = nil, parentStepDetails: ParentStepDetails? = nil, response: String? = nil, responseCode: String? = nil, stepExecutionId: String? = nil, stepName: String? = nil, stepStatus: AutomationExecutionStatus? = nil, targetLocation: TargetLocation? = nil, targets: [Target]? = nil, timeoutSeconds: Int64? = nil, triggeredAlarms: [AlarmStateInformation]? = nil, validNextSteps: [String]? = nil) {
            self.action = action
            self.executionEndTime = executionEndTime
            self.executionStartTime = executionStartTime
            self.failureDetails = failureDetails
            self.failureMessage = failureMessage
            self.inputs = inputs
            self.isCritical = isCritical
            self.isEnd = isEnd
            self.maxAttempts = maxAttempts
            self.nextStep = nextStep
            self.onFailure = onFailure
            self.outputs = outputs
            self.overriddenParameters = overriddenParameters
            self.parentStepDetails = parentStepDetails
            self.response = response
            self.responseCode = responseCode
            self.stepExecutionId = stepExecutionId
            self.stepName = stepName
            self.stepStatus = stepStatus
            self.targetLocation = targetLocation
            self.targets = targets
            self.timeoutSeconds = timeoutSeconds
            self.triggeredAlarms = triggeredAlarms
            self.validNextSteps = validNextSteps
        }

        private enum CodingKeys: String, CodingKey {
            case action = "Action"
            case executionEndTime = "ExecutionEndTime"
            case executionStartTime = "ExecutionStartTime"
            case failureDetails = "FailureDetails"
            case failureMessage = "FailureMessage"
            case inputs = "Inputs"
            case isCritical = "IsCritical"
            case isEnd = "IsEnd"
            case maxAttempts = "MaxAttempts"
            case nextStep = "NextStep"
            case onFailure = "OnFailure"
            case outputs = "Outputs"
            case overriddenParameters = "OverriddenParameters"
            case parentStepDetails = "ParentStepDetails"
            case response = "Response"
            case responseCode = "ResponseCode"
            case stepExecutionId = "StepExecutionId"
            case stepName = "StepName"
            case stepStatus = "StepStatus"
            case targetLocation = "TargetLocation"
            case targets = "Targets"
            case timeoutSeconds = "TimeoutSeconds"
            case triggeredAlarms = "TriggeredAlarms"
            case validNextSteps = "ValidNextSteps"
        }
    }

    public struct StepExecutionFilter: AWSEncodableShape {
        /// One or more keys to limit the results.
        public let key: StepExecutionFilterKey
        /// The values of the filter key.
        public let values: [String]

        @inlinable
        public init(key: StepExecutionFilterKey, values: [String]) {
            self.key = key
            self.values = values
        }

        public func validate(name: String) throws {
            try self.values.forEach {
                try validate($0, name: "values[]", parent: name, max: 150)
                try validate($0, name: "values[]", parent: name, min: 1)
            }
            try self.validate(self.values, name: "values", parent: name, max: 10)
            try self.validate(self.values, name: "values", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case values = "Values"
        }
    }

    public struct StopAutomationExecutionRequest: AWSEncodableShape {
        /// The execution ID of the Automation to stop.
        public let automationExecutionId: String
        /// The stop request type. Valid types include the following: Cancel and Complete. The default type is Cancel.
        public let type: StopType?

        @inlinable
        public init(automationExecutionId: String, type: StopType? = nil) {
            self.automationExecutionId = automationExecutionId
            self.type = type
        }

        public func validate(name: String) throws {
            try self.validate(self.automationExecutionId, name: "automationExecutionId", parent: name, max: 36)
            try self.validate(self.automationExecutionId, name: "automationExecutionId", parent: name, min: 36)
        }

        private enum CodingKeys: String, CodingKey {
            case automationExecutionId = "AutomationExecutionId"
            case type = "Type"
        }
    }

    public struct StopAutomationExecutionResult: AWSDecodableShape {
        public init() {}
    }

    public struct Tag: AWSEncodableShape & AWSDecodableShape {
        /// The name of the tag.
        public let key: String
        /// The value of the tag.
        public let value: String

        @inlinable
        public init(key: String, value: String) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 128)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.validate(self.key, name: "key", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            try self.validate(self.value, name: "value", parent: name, max: 256)
            try self.validate(self.value, name: "value", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct Target: AWSEncodableShape & AWSDecodableShape {
        /// User-defined criteria for sending commands that target managed nodes that meet the criteria.
        public let key: String?
        /// User-defined criteria that maps to Key. For example, if you specified tag:ServerRole, you could specify value:WebServer to run a command on instances that include EC2 tags of ServerRole,WebServer.  Depending on the type of target, the maximum number of values for a key might be lower than the global maximum of 50.
        public let values: [String]?

        @inlinable
        public init(key: String? = nil, values: [String]? = nil) {
            self.key = key
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 163)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.validate(self.key, name: "key", parent: name, pattern: "^[\\p{L}\\p{Z}\\p{N}_.:/=\\-@]*$|resource-groups:ResourceTypeFilters|resource-groups:Name$")
            try self.validate(self.values, name: "values", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case values = "Values"
        }
    }

    public struct TargetLocation: AWSEncodableShape & AWSDecodableShape {
        /// The Amazon Web Services accounts targeted by the current Automation execution.
        public let accounts: [String]?
        /// Amazon Web Services accounts or organizational units to exclude as expanded targets.
        public let excludeAccounts: [String]?
        /// The Automation execution role used by the currently running Automation. If not specified, the default value is AWS-SystemsManager-AutomationExecutionRole.
        public let executionRoleName: String?
        /// Indicates whether to include child organizational units (OUs) that are children of the targeted OUs. The default is false.
        public let includeChildOrganizationUnits: Bool?
        /// The Amazon Web Services Regions targeted by the current Automation execution.
        public let regions: [String]?
        public let targetLocationAlarmConfiguration: AlarmConfiguration?
        /// The maximum number of Amazon Web Services Regions and Amazon Web Services accounts allowed to run the Automation concurrently.
        public let targetLocationMaxConcurrency: String?
        /// The maximum number of errors allowed before the system stops queueing additional Automation executions for the currently running Automation.
        public let targetLocationMaxErrors: String?
        /// A list of key-value mappings to target resources. If you specify values for this data type, you must also specify a value for TargetParameterName. This Targets parameter takes precedence over the StartAutomationExecution:Targets parameter if both are supplied.
        public let targets: [Target]?
        /// The maximum number of targets allowed to run this task in parallel. This TargetsMaxConcurrency takes precedence over the StartAutomationExecution:MaxConcurrency parameter if both are supplied.
        public let targetsMaxConcurrency: String?
        /// The maximum number of errors that are allowed before the system stops running the automation on additional targets. This TargetsMaxErrors parameter takes precedence over the StartAutomationExecution:MaxErrors parameter if both are supplied.
        public let targetsMaxErrors: String?

        @inlinable
        public init(accounts: [String]? = nil, excludeAccounts: [String]? = nil, executionRoleName: String? = nil, includeChildOrganizationUnits: Bool? = nil, regions: [String]? = nil, targetLocationAlarmConfiguration: AlarmConfiguration? = nil, targetLocationMaxConcurrency: String? = nil, targetLocationMaxErrors: String? = nil, targets: [Target]? = nil, targetsMaxConcurrency: String? = nil, targetsMaxErrors: String? = nil) {
            self.accounts = accounts
            self.excludeAccounts = excludeAccounts
            self.executionRoleName = executionRoleName
            self.includeChildOrganizationUnits = includeChildOrganizationUnits
            self.regions = regions
            self.targetLocationAlarmConfiguration = targetLocationAlarmConfiguration
            self.targetLocationMaxConcurrency = targetLocationMaxConcurrency
            self.targetLocationMaxErrors = targetLocationMaxErrors
            self.targets = targets
            self.targetsMaxConcurrency = targetsMaxConcurrency
            self.targetsMaxErrors = targetsMaxErrors
        }

        public func validate(name: String) throws {
            try self.validate(self.accounts, name: "accounts", parent: name, max: 50)
            try self.validate(self.accounts, name: "accounts", parent: name, min: 1)
            try self.excludeAccounts?.forEach {
                try validate($0, name: "excludeAccounts[]", parent: name, max: 68)
                try validate($0, name: "excludeAccounts[]", parent: name, min: 6)
                try validate($0, name: "excludeAccounts[]", parent: name, pattern: "^(ou-[a-z0-9]{4,32}-[a-z0-9]{8,32})|(\\d{12})$")
            }
            try self.validate(self.excludeAccounts, name: "excludeAccounts", parent: name, max: 5000)
            try self.validate(self.excludeAccounts, name: "excludeAccounts", parent: name, min: 1)
            try self.validate(self.executionRoleName, name: "executionRoleName", parent: name, max: 64)
            try self.validate(self.executionRoleName, name: "executionRoleName", parent: name, min: 1)
            try self.validate(self.executionRoleName, name: "executionRoleName", parent: name, pattern: "^[\\w+=,.@/-]+$")
            try self.validate(self.regions, name: "regions", parent: name, max: 50)
            try self.validate(self.regions, name: "regions", parent: name, min: 1)
            try self.targetLocationAlarmConfiguration?.validate(name: "\(name).targetLocationAlarmConfiguration")
            try self.validate(self.targetLocationMaxConcurrency, name: "targetLocationMaxConcurrency", parent: name, max: 7)
            try self.validate(self.targetLocationMaxConcurrency, name: "targetLocationMaxConcurrency", parent: name, min: 1)
            try self.validate(self.targetLocationMaxConcurrency, name: "targetLocationMaxConcurrency", parent: name, pattern: "^([1-9][0-9]*|[1-9][0-9]%|[1-9]%|100%)$")
            try self.validate(self.targetLocationMaxErrors, name: "targetLocationMaxErrors", parent: name, max: 7)
            try self.validate(self.targetLocationMaxErrors, name: "targetLocationMaxErrors", parent: name, min: 1)
            try self.validate(self.targetLocationMaxErrors, name: "targetLocationMaxErrors", parent: name, pattern: "^([1-9][0-9]*|[0]|[1-9][0-9]%|[0-9]%|100%)$")
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
            try self.validate(self.targets, name: "targets", parent: name, max: 5)
            try self.validate(self.targetsMaxConcurrency, name: "targetsMaxConcurrency", parent: name, max: 7)
            try self.validate(self.targetsMaxConcurrency, name: "targetsMaxConcurrency", parent: name, min: 1)
            try self.validate(self.targetsMaxConcurrency, name: "targetsMaxConcurrency", parent: name, pattern: "^([1-9][0-9]*|[1-9][0-9]%|[1-9]%|100%)$")
            try self.validate(self.targetsMaxErrors, name: "targetsMaxErrors", parent: name, max: 7)
            try self.validate(self.targetsMaxErrors, name: "targetsMaxErrors", parent: name, min: 1)
            try self.validate(self.targetsMaxErrors, name: "targetsMaxErrors", parent: name, pattern: "^([1-9][0-9]*|[0]|[1-9][0-9]%|[0-9]%|100%)$")
        }

        private enum CodingKeys: String, CodingKey {
            case accounts = "Accounts"
            case excludeAccounts = "ExcludeAccounts"
            case executionRoleName = "ExecutionRoleName"
            case includeChildOrganizationUnits = "IncludeChildOrganizationUnits"
            case regions = "Regions"
            case targetLocationAlarmConfiguration = "TargetLocationAlarmConfiguration"
            case targetLocationMaxConcurrency = "TargetLocationMaxConcurrency"
            case targetLocationMaxErrors = "TargetLocationMaxErrors"
            case targets = "Targets"
            case targetsMaxConcurrency = "TargetsMaxConcurrency"
            case targetsMaxErrors = "TargetsMaxErrors"
        }
    }

    public struct TargetPreview: AWSDecodableShape {
        /// The number of resources of a certain type included in an execution preview.
        public let count: Int?
        /// A type of resource that was included in the execution preview.
        public let targetType: String?

        @inlinable
        public init(count: Int? = nil, targetType: String? = nil) {
            self.count = count
            self.targetType = targetType
        }

        private enum CodingKeys: String, CodingKey {
            case count = "Count"
            case targetType = "TargetType"
        }
    }

    public struct TerminateSessionRequest: AWSEncodableShape {
        /// The ID of the session to terminate.
        public let sessionId: String

        @inlinable
        public init(sessionId: String) {
            self.sessionId = sessionId
        }

        public func validate(name: String) throws {
            try self.validate(self.sessionId, name: "sessionId", parent: name, max: 96)
            try self.validate(self.sessionId, name: "sessionId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case sessionId = "SessionId"
        }
    }

    public struct TerminateSessionResponse: AWSDecodableShape {
        /// The ID of the session that has been terminated.
        public let sessionId: String?

        @inlinable
        public init(sessionId: String? = nil) {
            self.sessionId = sessionId
        }

        private enum CodingKeys: String, CodingKey {
            case sessionId = "SessionId"
        }
    }

    public struct ThrottlingException: AWSErrorShape {
        public let message: String
        /// The quota code recognized by the Amazon Web Services Service Quotas service.
        public let quotaCode: String?
        /// The code for the Amazon Web Services service that owns the quota.
        public let serviceCode: String?

        @inlinable
        public init(message: String, quotaCode: String? = nil, serviceCode: String? = nil) {
            self.message = message
            self.quotaCode = quotaCode
            self.serviceCode = serviceCode
        }

        private enum CodingKeys: String, CodingKey {
            case message = "Message"
            case quotaCode = "QuotaCode"
            case serviceCode = "ServiceCode"
        }
    }

    public struct UnlabelParameterVersionRequest: AWSEncodableShape {
        /// One or more labels to delete from the specified parameter version.
        public let labels: [String]
        /// The name of the parameter from which you want to delete one or more labels.  You can't enter the Amazon Resource Name (ARN) for a parameter, only the parameter name itself.
        public let name: String
        /// The specific version of the parameter which you want to delete one or more labels from. If it isn't present, the call will fail.
        public let parameterVersion: Int64

        @inlinable
        public init(labels: [String], name: String, parameterVersion: Int64) {
            self.labels = labels
            self.name = name
            self.parameterVersion = parameterVersion
        }

        public func validate(name: String) throws {
            try self.labels.forEach {
                try validate($0, name: "labels[]", parent: name, max: 100)
                try validate($0, name: "labels[]", parent: name, min: 1)
            }
            try self.validate(self.labels, name: "labels", parent: name, max: 10)
            try self.validate(self.labels, name: "labels", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 2048)
            try self.validate(self.name, name: "name", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case labels = "Labels"
            case name = "Name"
            case parameterVersion = "ParameterVersion"
        }
    }

    public struct UnlabelParameterVersionResult: AWSDecodableShape {
        /// The labels that aren't attached to the given parameter version.
        public let invalidLabels: [String]?
        /// A list of all labels deleted from the parameter.
        public let removedLabels: [String]?

        @inlinable
        public init(invalidLabels: [String]? = nil, removedLabels: [String]? = nil) {
            self.invalidLabels = invalidLabels
            self.removedLabels = removedLabels
        }

        private enum CodingKeys: String, CodingKey {
            case invalidLabels = "InvalidLabels"
            case removedLabels = "RemovedLabels"
        }
    }

    public struct UnsupportedInventoryItemContextException: AWSErrorShape {
        public let message: String?
        public let typeName: String?

        @inlinable
        public init(message: String? = nil, typeName: String? = nil) {
            self.message = message
            self.typeName = typeName
        }

        private enum CodingKeys: String, CodingKey {
            case message = "Message"
            case typeName = "TypeName"
        }
    }

    public struct UpdateAssociationRequest: AWSEncodableShape {
        public let alarmConfiguration: AlarmConfiguration?
        /// By default, when you update an association, the system runs it immediately after it is updated and then according to the schedule you specified. Specify true for ApplyOnlyAtCronInterval if you want the association to run only according to the schedule you specified. If you chose this option when you created an association and later you edit that association or you make changes to the Automation runbook or SSM document on which that association is based, State Manager applies the association at the next specified cron interval. For example, if you chose the Latest version of an SSM document when you created an association and you edit the association by choosing a different document version on the Documents page, State Manager applies the association at the next specified cron interval if you previously set ApplyOnlyAtCronInterval to true. If this option wasn't selected, State Manager immediately runs the association. For more information, see Understanding when associations are applied to resources and About target updates with Automation runbooks in the Amazon Web Services Systems Manager User Guide. This parameter isn't supported for rate expressions. You can reset this parameter. To do so, specify the no-apply-only-at-cron-interval parameter when you update the association from the command line. This parameter forces the association to run immediately after updating it and according to the interval specified.
        public let applyOnlyAtCronInterval: Bool?
        /// The ID of the association you want to update.
        public let associationId: String
        /// The name of the association that you want to update.
        public let associationName: String?
        /// This parameter is provided for concurrency control purposes. You must specify the latest association version in the service. If you want to ensure that this request succeeds, either specify $LATEST, or omit this parameter.
        public let associationVersion: String?
        /// Choose the parameter that will define how your automation will branch out. This target is required for associations that use an Automation runbook and target resources by using rate controls. Automation is a tool in Amazon Web Services Systems Manager.
        public let automationTargetParameterName: String?
        /// The names or Amazon Resource Names (ARNs) of the Change Calendar type documents you want to gate your associations under. The associations only run when that change calendar is open. For more information, see Amazon Web Services Systems Manager Change Calendar in the Amazon Web Services Systems Manager User Guide.
        public let calendarNames: [String]?
        /// The severity level to assign to the association.
        public let complianceSeverity: AssociationComplianceSeverity?
        /// The document version you want update for the association.   State Manager doesn't support running associations that use a new version of a document if that document is shared from another account. State Manager always runs the default version of a document if shared from another account, even though the Systems Manager console shows that a new version was processed. If you want to run an association using a new version of a document shared form another account, you must set the document version to default.
        public let documentVersion: String?
        /// The number of hours the association can run before it is canceled. Duration applies to associations that are currently running, and any pending and in progress commands on all targets. If a target was taken offline for the association to run, it is made available again immediately, without a reboot.  The Duration parameter applies only when both these conditions are true:   The association for which you specify a duration is cancelable according to the parameters of the SSM command document or Automation runbook associated with this execution.    The command specifies the  ApplyOnlyAtCronInterval parameter, which means that the association doesn't run immediately after it is updated, but only according to the specified schedule.
        public let duration: Int?
        /// The maximum number of targets allowed to run the association at the same time. You can specify a number, for example 10, or a percentage of the target set, for example 10%. The default value is 100%, which means all targets run the association at the same time. If a new managed node starts and attempts to run an association while Systems Manager is running MaxConcurrency associations, the association is allowed to run. During the next association interval, the new managed node will process its association within the limit specified for MaxConcurrency.
        public let maxConcurrency: String?
        /// The number of errors that are allowed before the system stops sending requests to run the association on additional targets. You can specify either an absolute number of errors, for example 10, or a percentage of the target set, for example 10%. If you specify 3, for example, the system stops sending requests when the fourth error is received. If you specify 0, then the system stops sending requests after the first error is returned. If you run an association on 50 managed nodes and set MaxError to 10%, then the system stops sending the request when the sixth error is received. Executions that are already running an association when MaxErrors is reached are allowed to complete, but some of these executions may fail as well. If you need to ensure that there won't be more than max-errors failed executions, set MaxConcurrency to 1 so that executions proceed one at a time.
        public let maxErrors: String?
        /// The name of the SSM Command document or Automation runbook that contains the configuration information for the managed node. You can specify Amazon Web Services-predefined documents, documents you created, or a document that is shared with you from another account. For Systems Manager document (SSM document) that are shared with you from other Amazon Web Services accounts, you must specify the complete SSM document ARN, in the following format:  arn:aws:ssm:region:account-id:document/document-name   For example:  arn:aws:ssm:us-east-2:12345678912:document/My-Shared-Document  For Amazon Web Services-predefined documents and SSM documents you created in your account, you only need to specify the document name. For example, AWS-ApplyPatchBaseline or My-Document.
        public let name: String?
        /// An S3 bucket where you want to store the results of this request.
        public let outputLocation: InstanceAssociationOutputLocation?
        /// The parameters you want to update for the association. If you create a parameter using Parameter Store, a tool in Amazon Web Services Systems Manager, you can reference the parameter using {{ssm:parameter-name}}.
        public let parameters: [String: [String]]?
        /// The cron expression used to schedule the association that you want to update.
        public let scheduleExpression: String?
        /// Number of days to wait after the scheduled day to run an association. For example, if you specified a cron schedule of cron(0 0 ? * THU#2 *), you could specify an offset of 3 to run the association each Sunday after the second Thursday of the month. For more information about cron schedules for associations, see Reference: Cron and rate expressions for Systems Manager in the Amazon Web Services Systems Manager User Guide.   To use offsets, you must specify the ApplyOnlyAtCronInterval parameter. This option tells the system not to run an association immediately after you create it.
        public let scheduleOffset: Int?
        /// The mode for generating association compliance. You can specify AUTO or MANUAL. In AUTO mode, the system uses the status of the association execution to determine the compliance status. If the association execution runs successfully, then the association is COMPLIANT. If the association execution doesn't run successfully, the association is NON-COMPLIANT. In MANUAL mode, you must specify the AssociationId as a parameter for the PutComplianceItems API operation. In this case, compliance data isn't managed by State Manager, a tool in Amazon Web Services Systems Manager. It is managed by your direct call to the PutComplianceItems API operation. By default, all associations use AUTO mode.
        public let syncCompliance: AssociationSyncCompliance?
        /// A location is a combination of Amazon Web Services Regions and Amazon Web Services accounts where you want to run the association. Use this action to update an association in multiple Regions and multiple accounts.
        public let targetLocations: [TargetLocation]?
        /// A key-value mapping of document parameters to target resources. Both Targets and TargetMaps can't be specified together.
        public let targetMaps: [[String: [String]]]?
        /// The targets of the association.
        public let targets: [Target]?

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, applyOnlyAtCronInterval: Bool? = nil, associationId: String, associationName: String? = nil, associationVersion: String? = nil, automationTargetParameterName: String? = nil, calendarNames: [String]? = nil, complianceSeverity: AssociationComplianceSeverity? = nil, documentVersion: String? = nil, duration: Int? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, name: String? = nil, outputLocation: InstanceAssociationOutputLocation? = nil, parameters: [String: [String]]? = nil, scheduleExpression: String? = nil, scheduleOffset: Int? = nil, syncCompliance: AssociationSyncCompliance? = nil, targetLocations: [TargetLocation]? = nil, targetMaps: [[String: [String]]]? = nil, targets: [Target]? = nil) {
            self.alarmConfiguration = alarmConfiguration
            self.applyOnlyAtCronInterval = applyOnlyAtCronInterval
            self.associationId = associationId
            self.associationName = associationName
            self.associationVersion = associationVersion
            self.automationTargetParameterName = automationTargetParameterName
            self.calendarNames = calendarNames
            self.complianceSeverity = complianceSeverity
            self.documentVersion = documentVersion
            self.duration = duration
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.name = name
            self.outputLocation = outputLocation
            self.parameters = parameters
            self.scheduleExpression = scheduleExpression
            self.scheduleOffset = scheduleOffset
            self.syncCompliance = syncCompliance
            self.targetLocations = targetLocations
            self.targetMaps = targetMaps
            self.targets = targets
        }

        public func validate(name: String) throws {
            try self.alarmConfiguration?.validate(name: "\(name).alarmConfiguration")
            try self.validate(self.associationId, name: "associationId", parent: name, pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")
            try self.validate(self.associationName, name: "associationName", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.validate(self.associationVersion, name: "associationVersion", parent: name, pattern: "^([$]LATEST)|([1-9][0-9]*)$")
            try self.validate(self.automationTargetParameterName, name: "automationTargetParameterName", parent: name, max: 50)
            try self.validate(self.automationTargetParameterName, name: "automationTargetParameterName", parent: name, min: 1)
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.validate(self.duration, name: "duration", parent: name, max: 24)
            try self.validate(self.duration, name: "duration", parent: name, min: 1)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, max: 7)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, min: 1)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, pattern: "^([1-9][0-9]*|[1-9][0-9]%|[1-9]%|100%)$")
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, max: 7)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, min: 1)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, pattern: "^([1-9][0-9]*|[0]|[1-9][0-9]%|[0-9]%|100%)$")
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.:/]{3,128}$")
            try self.outputLocation?.validate(name: "\(name).outputLocation")
            try self.validate(self.scheduleExpression, name: "scheduleExpression", parent: name, max: 256)
            try self.validate(self.scheduleExpression, name: "scheduleExpression", parent: name, min: 1)
            try self.validate(self.scheduleOffset, name: "scheduleOffset", parent: name, max: 6)
            try self.validate(self.scheduleOffset, name: "scheduleOffset", parent: name, min: 1)
            try self.targetLocations?.forEach {
                try $0.validate(name: "\(name).targetLocations[]")
            }
            try self.validate(self.targetLocations, name: "targetLocations", parent: name, max: 100)
            try self.validate(self.targetLocations, name: "targetLocations", parent: name, min: 1)
            try self.targetMaps?.forEach {
                try validate($0, name: "targetMaps[]", parent: name, max: 20)
                try validate($0, name: "targetMaps[]", parent: name, min: 1)
            }
            try self.validate(self.targetMaps, name: "targetMaps", parent: name, max: 300)
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
            try self.validate(self.targets, name: "targets", parent: name, max: 5)
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case applyOnlyAtCronInterval = "ApplyOnlyAtCronInterval"
            case associationId = "AssociationId"
            case associationName = "AssociationName"
            case associationVersion = "AssociationVersion"
            case automationTargetParameterName = "AutomationTargetParameterName"
            case calendarNames = "CalendarNames"
            case complianceSeverity = "ComplianceSeverity"
            case documentVersion = "DocumentVersion"
            case duration = "Duration"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case name = "Name"
            case outputLocation = "OutputLocation"
            case parameters = "Parameters"
            case scheduleExpression = "ScheduleExpression"
            case scheduleOffset = "ScheduleOffset"
            case syncCompliance = "SyncCompliance"
            case targetLocations = "TargetLocations"
            case targetMaps = "TargetMaps"
            case targets = "Targets"
        }
    }

    public struct UpdateAssociationResult: AWSDecodableShape {
        /// The description of the association that was updated.
        public let associationDescription: AssociationDescription?

        @inlinable
        public init(associationDescription: AssociationDescription? = nil) {
            self.associationDescription = associationDescription
        }

        private enum CodingKeys: String, CodingKey {
            case associationDescription = "AssociationDescription"
        }
    }

    public struct UpdateAssociationStatusRequest: AWSEncodableShape {
        /// The association status.
        public let associationStatus: AssociationStatus
        /// The managed node ID.
        public let instanceId: String
        /// The name of the SSM document.
        public let name: String

        @inlinable
        public init(associationStatus: AssociationStatus, instanceId: String, name: String) {
            self.associationStatus = associationStatus
            self.instanceId = instanceId
            self.name = name
        }

        public func validate(name: String) throws {
            try self.associationStatus.validate(name: "\(name).associationStatus")
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^i-(\\w{8}|\\w{17})$)|(^mi-\\w{17}$)$")
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.:/]{3,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case associationStatus = "AssociationStatus"
            case instanceId = "InstanceId"
            case name = "Name"
        }
    }

    public struct UpdateAssociationStatusResult: AWSDecodableShape {
        /// Information about the association.
        public let associationDescription: AssociationDescription?

        @inlinable
        public init(associationDescription: AssociationDescription? = nil) {
            self.associationDescription = associationDescription
        }

        private enum CodingKeys: String, CodingKey {
            case associationDescription = "AssociationDescription"
        }
    }

    public struct UpdateDocumentDefaultVersionRequest: AWSEncodableShape {
        /// The version of a custom document that you want to set as the default version.
        public let documentVersion: String
        /// The name of a custom document that you want to set as the default version.
        public let name: String

        @inlinable
        public init(documentVersion: String, name: String) {
            self.documentVersion = documentVersion
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^(^[1-9][0-9]*$)$")
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case documentVersion = "DocumentVersion"
            case name = "Name"
        }
    }

    public struct UpdateDocumentDefaultVersionResult: AWSDecodableShape {
        /// The description of a custom document that you want to set as the default version.
        public let description: DocumentDefaultVersionDescription?

        @inlinable
        public init(description: DocumentDefaultVersionDescription? = nil) {
            self.description = description
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
        }
    }

    public struct UpdateDocumentMetadataRequest: AWSEncodableShape {
        /// The change template review details to update.
        public let documentReviews: DocumentReviews
        /// The version of a change template in which to update approval metadata.
        public let documentVersion: String?
        /// The name of the change template for which a version's metadata is to be updated.
        public let name: String

        @inlinable
        public init(documentReviews: DocumentReviews, documentVersion: String? = nil, name: String) {
            self.documentReviews = documentReviews
            self.documentVersion = documentVersion
            self.name = name
        }

        public func validate(name: String) throws {
            try self.documentReviews.validate(name: "\(name).documentReviews")
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case documentReviews = "DocumentReviews"
            case documentVersion = "DocumentVersion"
            case name = "Name"
        }
    }

    public struct UpdateDocumentMetadataResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateDocumentRequest: AWSEncodableShape {
        /// A list of key-value pairs that describe attachments to a version of a document.
        public let attachments: [AttachmentsSource]?
        /// A valid JSON or YAML string.
        public let content: String
        /// The friendly name of the SSM document that you want to update. This value can differ for each version of the document. If you don't specify a value for this parameter in your request, the existing value is applied to the new document version.
        public let displayName: String?
        /// Specify the document format for the new document version. Systems Manager supports JSON and YAML documents. JSON is the default format.
        public let documentFormat: DocumentFormat?
        /// The version of the document that you want to update. Currently, Systems Manager supports updating only the latest version of the document. You can specify the version number of the latest version or use the $LATEST variable.  If you change a document version for a State Manager association, Systems Manager immediately runs the association unless you previously specifed the apply-only-at-cron-interval parameter.
        public let documentVersion: String?
        /// The name of the SSM document that you want to update.
        public let name: String
        /// Specify a new target type for the document.
        public let targetType: String?
        /// An optional field specifying the version of the artifact you are updating with the document. For example, 12.6. This value is unique across all versions of a document, and can't be changed.
        public let versionName: String?

        @inlinable
        public init(attachments: [AttachmentsSource]? = nil, content: String, displayName: String? = nil, documentFormat: DocumentFormat? = nil, documentVersion: String? = nil, name: String, targetType: String? = nil, versionName: String? = nil) {
            self.attachments = attachments
            self.content = content
            self.displayName = displayName
            self.documentFormat = documentFormat
            self.documentVersion = documentVersion
            self.name = name
            self.targetType = targetType
            self.versionName = versionName
        }

        public func validate(name: String) throws {
            try self.attachments?.forEach {
                try $0.validate(name: "\(name).attachments[]")
            }
            try self.validate(self.attachments, name: "attachments", parent: name, max: 20)
            try self.validate(self.content, name: "content", parent: name, min: 1)
            try self.validate(self.displayName, name: "displayName", parent: name, max: 1024)
            try self.validate(self.displayName, name: "displayName", parent: name, pattern: "^[\\w\\.\\-\\:\\/ ]*$")
            try self.validate(self.documentVersion, name: "documentVersion", parent: name, pattern: "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$")
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.validate(self.targetType, name: "targetType", parent: name, max: 200)
            try self.validate(self.targetType, name: "targetType", parent: name, pattern: "^\\/[\\w\\.\\-\\:\\/]*$")
            try self.validate(self.versionName, name: "versionName", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{1,128}$")
        }

        private enum CodingKeys: String, CodingKey {
            case attachments = "Attachments"
            case content = "Content"
            case displayName = "DisplayName"
            case documentFormat = "DocumentFormat"
            case documentVersion = "DocumentVersion"
            case name = "Name"
            case targetType = "TargetType"
            case versionName = "VersionName"
        }
    }

    public struct UpdateDocumentResult: AWSDecodableShape {
        /// A description of the document that was updated.
        public let documentDescription: DocumentDescription?

        @inlinable
        public init(documentDescription: DocumentDescription? = nil) {
            self.documentDescription = documentDescription
        }

        private enum CodingKeys: String, CodingKey {
            case documentDescription = "DocumentDescription"
        }
    }

    public struct UpdateMaintenanceWindowRequest: AWSEncodableShape {
        /// Whether targets must be registered with the maintenance window before tasks can be defined for those targets.
        public let allowUnassociatedTargets: Bool?
        /// The number of hours before the end of the maintenance window that Amazon Web Services Systems Manager stops scheduling new tasks for execution.
        public let cutoff: Int?
        /// An optional description for the update request.
        public let description: String?
        /// The duration of the maintenance window in hours.
        public let duration: Int?
        /// Whether the maintenance window is enabled.
        public let enabled: Bool?
        /// The date and time, in ISO-8601 Extended format, for when you want the maintenance window to become inactive. EndDate allows you to set a date and time in the future when the maintenance window will no longer run.
        public let endDate: String?
        /// The name of the maintenance window.
        public let name: String?
        /// If True, then all fields that are required by the CreateMaintenanceWindow operation are also required for this API request. Optional fields that aren't specified are set to null.
        public let replace: Bool?
        /// The schedule of the maintenance window in the form of a cron or rate expression.
        public let schedule: String?
        /// The number of days to wait after the date and time specified by a cron expression before running the maintenance window. For example, the following cron expression schedules a maintenance window to run the third Tuesday of every month at 11:30 PM.  cron(30 23 ? * TUE#3 *)  If the schedule offset is 2, the maintenance window won't run until two days later.
        public let scheduleOffset: Int?
        /// The time zone that the scheduled maintenance window executions are based on, in Internet Assigned Numbers Authority (IANA) format. For example: "America/Los_Angeles", "UTC", or "Asia/Seoul". For more information, see the Time Zone Database on the IANA website.
        public let scheduleTimezone: String?
        /// The date and time, in ISO-8601 Extended format, for when you want the maintenance window to become active. StartDate allows you to delay activation of the maintenance window until the specified future date.  When using a rate schedule, if you provide a start date that occurs in the past, the current date and time are used as the start date.
        public let startDate: String?
        /// The ID of the maintenance window to update.
        public let windowId: String

        @inlinable
        public init(allowUnassociatedTargets: Bool? = nil, cutoff: Int? = nil, description: String? = nil, duration: Int? = nil, enabled: Bool? = nil, endDate: String? = nil, name: String? = nil, replace: Bool? = nil, schedule: String? = nil, scheduleOffset: Int? = nil, scheduleTimezone: String? = nil, startDate: String? = nil, windowId: String) {
            self.allowUnassociatedTargets = allowUnassociatedTargets
            self.cutoff = cutoff
            self.description = description
            self.duration = duration
            self.enabled = enabled
            self.endDate = endDate
            self.name = name
            self.replace = replace
            self.schedule = schedule
            self.scheduleOffset = scheduleOffset
            self.scheduleTimezone = scheduleTimezone
            self.startDate = startDate
            self.windowId = windowId
        }

        public func validate(name: String) throws {
            try self.validate(self.cutoff, name: "cutoff", parent: name, max: 23)
            try self.validate(self.cutoff, name: "cutoff", parent: name, min: 0)
            try self.validate(self.description, name: "description", parent: name, max: 128)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.duration, name: "duration", parent: name, max: 24)
            try self.validate(self.duration, name: "duration", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 128)
            try self.validate(self.name, name: "name", parent: name, min: 3)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.validate(self.schedule, name: "schedule", parent: name, max: 256)
            try self.validate(self.schedule, name: "schedule", parent: name, min: 1)
            try self.validate(self.scheduleOffset, name: "scheduleOffset", parent: name, max: 6)
            try self.validate(self.scheduleOffset, name: "scheduleOffset", parent: name, min: 1)
            try self.validate(self.windowId, name: "windowId", parent: name, max: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, min: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, pattern: "^mw-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case allowUnassociatedTargets = "AllowUnassociatedTargets"
            case cutoff = "Cutoff"
            case description = "Description"
            case duration = "Duration"
            case enabled = "Enabled"
            case endDate = "EndDate"
            case name = "Name"
            case replace = "Replace"
            case schedule = "Schedule"
            case scheduleOffset = "ScheduleOffset"
            case scheduleTimezone = "ScheduleTimezone"
            case startDate = "StartDate"
            case windowId = "WindowId"
        }
    }

    public struct UpdateMaintenanceWindowResult: AWSDecodableShape {
        /// Whether targets must be registered with the maintenance window before tasks can be defined for those targets.
        public let allowUnassociatedTargets: Bool?
        /// The number of hours before the end of the maintenance window that Amazon Web Services Systems Manager stops scheduling new tasks for execution.
        public let cutoff: Int?
        /// An optional description of the update.
        public let description: String?
        /// The duration of the maintenance window in hours.
        public let duration: Int?
        /// Whether the maintenance window is enabled.
        public let enabled: Bool?
        /// The date and time, in ISO-8601 Extended format, for when the maintenance window is scheduled to become inactive. The maintenance window won't run after this specified time.
        public let endDate: String?
        /// The name of the maintenance window.
        public let name: String?
        /// The schedule of the maintenance window in the form of a cron or rate expression.
        public let schedule: String?
        /// The number of days to wait to run a maintenance window after the scheduled cron expression date and time.
        public let scheduleOffset: Int?
        /// The time zone that the scheduled maintenance window executions are based on, in Internet Assigned Numbers Authority (IANA) format. For example: "America/Los_Angeles", "UTC", or "Asia/Seoul". For more information, see the Time Zone Database on the IANA website.
        public let scheduleTimezone: String?
        /// The date and time, in ISO-8601 Extended format, for when the maintenance window is scheduled to become active. The maintenance window won't run before this specified time.
        public let startDate: String?
        /// The ID of the created maintenance window.
        public let windowId: String?

        @inlinable
        public init(allowUnassociatedTargets: Bool? = nil, cutoff: Int? = nil, description: String? = nil, duration: Int? = nil, enabled: Bool? = nil, endDate: String? = nil, name: String? = nil, schedule: String? = nil, scheduleOffset: Int? = nil, scheduleTimezone: String? = nil, startDate: String? = nil, windowId: String? = nil) {
            self.allowUnassociatedTargets = allowUnassociatedTargets
            self.cutoff = cutoff
            self.description = description
            self.duration = duration
            self.enabled = enabled
            self.endDate = endDate
            self.name = name
            self.schedule = schedule
            self.scheduleOffset = scheduleOffset
            self.scheduleTimezone = scheduleTimezone
            self.startDate = startDate
            self.windowId = windowId
        }

        private enum CodingKeys: String, CodingKey {
            case allowUnassociatedTargets = "AllowUnassociatedTargets"
            case cutoff = "Cutoff"
            case description = "Description"
            case duration = "Duration"
            case enabled = "Enabled"
            case endDate = "EndDate"
            case name = "Name"
            case schedule = "Schedule"
            case scheduleOffset = "ScheduleOffset"
            case scheduleTimezone = "ScheduleTimezone"
            case startDate = "StartDate"
            case windowId = "WindowId"
        }
    }

    public struct UpdateMaintenanceWindowTargetRequest: AWSEncodableShape {
        /// An optional description for the update.
        public let description: String?
        /// A name for the update.
        public let name: String?
        /// User-provided value that will be included in any Amazon CloudWatch Events events raised while running tasks for these targets in this maintenance window.
        public let ownerInformation: String?
        /// If True, then all fields that are required by the RegisterTargetWithMaintenanceWindow operation are also required for this API request. Optional fields that aren't specified are set to null.
        public let replace: Bool?
        /// The targets to add or replace.
        public let targets: [Target]?
        /// The maintenance window ID with which to modify the target.
        public let windowId: String
        /// The target ID to modify.
        public let windowTargetId: String

        @inlinable
        public init(description: String? = nil, name: String? = nil, ownerInformation: String? = nil, replace: Bool? = nil, targets: [Target]? = nil, windowId: String, windowTargetId: String) {
            self.description = description
            self.name = name
            self.ownerInformation = ownerInformation
            self.replace = replace
            self.targets = targets
            self.windowId = windowId
            self.windowTargetId = windowTargetId
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 128)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 128)
            try self.validate(self.name, name: "name", parent: name, min: 3)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.validate(self.ownerInformation, name: "ownerInformation", parent: name, max: 128)
            try self.validate(self.ownerInformation, name: "ownerInformation", parent: name, min: 1)
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
            try self.validate(self.targets, name: "targets", parent: name, max: 5)
            try self.validate(self.windowId, name: "windowId", parent: name, max: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, min: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, pattern: "^mw-[0-9a-f]{17}$")
            try self.validate(self.windowTargetId, name: "windowTargetId", parent: name, max: 36)
            try self.validate(self.windowTargetId, name: "windowTargetId", parent: name, min: 36)
            try self.validate(self.windowTargetId, name: "windowTargetId", parent: name, pattern: "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case name = "Name"
            case ownerInformation = "OwnerInformation"
            case replace = "Replace"
            case targets = "Targets"
            case windowId = "WindowId"
            case windowTargetId = "WindowTargetId"
        }
    }

    public struct UpdateMaintenanceWindowTargetResult: AWSDecodableShape {
        /// The updated description.
        public let description: String?
        /// The updated name.
        public let name: String?
        /// The updated owner.
        public let ownerInformation: String?
        /// The updated targets.
        public let targets: [Target]?
        /// The maintenance window ID specified in the update request.
        public let windowId: String?
        /// The target ID specified in the update request.
        public let windowTargetId: String?

        @inlinable
        public init(description: String? = nil, name: String? = nil, ownerInformation: String? = nil, targets: [Target]? = nil, windowId: String? = nil, windowTargetId: String? = nil) {
            self.description = description
            self.name = name
            self.ownerInformation = ownerInformation
            self.targets = targets
            self.windowId = windowId
            self.windowTargetId = windowTargetId
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case name = "Name"
            case ownerInformation = "OwnerInformation"
            case targets = "Targets"
            case windowId = "WindowId"
            case windowTargetId = "WindowTargetId"
        }
    }

    public struct UpdateMaintenanceWindowTaskRequest: AWSEncodableShape {
        /// The CloudWatch alarm you want to apply to your maintenance window task.
        public let alarmConfiguration: AlarmConfiguration?
        /// Indicates whether tasks should continue to run after the cutoff time specified in the maintenance windows is reached.     CONTINUE_TASK: When the cutoff time is reached, any tasks that are running continue. The default value.    CANCEL_TASK:   For Automation, Lambda, Step Functions tasks: When the cutoff time is reached, any task invocations that are already running continue, but no new task invocations are started.   For Run Command tasks: When the cutoff time is reached, the system sends a CancelCommand operation that attempts to cancel the command associated with the task. However, there is no guarantee that the command will be terminated and the underlying process stopped.   The status for tasks that are not completed is TIMED_OUT.
        public let cutoffBehavior: MaintenanceWindowTaskCutoffBehavior?
        /// The new task description to specify.
        public let description: String?
        /// The new logging location in Amazon S3 to specify.   LoggingInfo has been deprecated. To specify an Amazon Simple Storage Service (Amazon S3) bucket to contain logs, instead use the OutputS3BucketName and OutputS3KeyPrefix options in the TaskInvocationParameters structure. For information about how Amazon Web Services Systems Manager handles these options for the supported maintenance window task types, see MaintenanceWindowTaskInvocationParameters.
        public let loggingInfo: LoggingInfo?
        /// The new MaxConcurrency value you want to specify. MaxConcurrency is the number of targets that are allowed to run this task, in parallel.  Although this element is listed as "Required: No", a value can be omitted only when you are registering or updating a targetless task You must provide a value in all other cases. For maintenance window tasks without a target specified, you can't supply a value for this option. Instead, the system inserts a placeholder value of 1. This value doesn't affect the running of your task.
        public let maxConcurrency: String?
        /// The new MaxErrors value to specify. MaxErrors is the maximum number of errors that are allowed before the task stops being scheduled.  Although this element is listed as "Required: No", a value can be omitted only when you are registering or updating a targetless task You must provide a value in all other cases. For maintenance window tasks without a target specified, you can't supply a value for this option. Instead, the system inserts a placeholder value of 1. This value doesn't affect the running of your task.
        public let maxErrors: String?
        /// The new task name to specify.
        public let name: String?
        /// The new task priority to specify. The lower the number, the higher the priority. Tasks that have the same priority are scheduled in parallel.
        public let priority: Int?
        /// If True, then all fields that are required by the RegisterTaskWithMaintenanceWindow operation are also required for this API request. Optional fields that aren't specified are set to null.
        public let replace: Bool?
        /// The Amazon Resource Name (ARN) of the IAM service role for Amazon Web Services Systems Manager to assume when running a maintenance window task. If you do not specify a service role ARN, Systems Manager uses a service-linked role in your account. If no appropriate service-linked role for Systems Manager exists in your account, it is created when you run RegisterTaskWithMaintenanceWindow. However, for an improved security posture, we strongly recommend creating a custom policy and custom service role for running your maintenance window tasks. The policy can be crafted to provide only the permissions needed for your particular maintenance window tasks. For more information, see Setting up Maintenance Windows in the in the Amazon Web Services Systems Manager User Guide.
        public let serviceRoleArn: String?
        /// The targets (either managed nodes or tags) to modify. Managed nodes are specified using the format Key=instanceids,Values=instanceID_1,instanceID_2. Tags are specified using the format  Key=tag_name,Values=tag_value.   One or more targets must be specified for maintenance window Run Command-type tasks. Depending on the task, targets are optional for other maintenance window task types (Automation, Lambda, and Step Functions). For more information about running tasks that don't specify targets, see Registering maintenance window tasks without targets in the Amazon Web Services Systems Manager User Guide.
        public let targets: [Target]?
        /// The task ARN to modify.
        public let taskArn: String?
        /// The parameters that the task should use during execution. Populate only the fields that match the task type. All other fields should be empty.  When you update a maintenance window task that has options specified in TaskInvocationParameters, you must provide again all the TaskInvocationParameters values that you want to retain. The values you don't specify again are removed. For example, suppose that when you registered a Run Command task, you specified TaskInvocationParameters values for Comment, NotificationConfig, and OutputS3BucketName. If you update the maintenance window task and specify only a different OutputS3BucketName value, the values for Comment and NotificationConfig are removed.
        public let taskInvocationParameters: MaintenanceWindowTaskInvocationParameters?
        /// The parameters to modify.   TaskParameters has been deprecated. To specify parameters to pass to a task when it runs, instead use the Parameters option in the TaskInvocationParameters structure. For information about how Systems Manager handles these options for the supported maintenance window task types, see MaintenanceWindowTaskInvocationParameters.  The map has the following format: Key: string, between 1 and 255 characters Value: an array of strings, each string is between 1 and 255 characters
        public let taskParameters: [String: MaintenanceWindowTaskParameterValueExpression]?
        /// The maintenance window ID that contains the task to modify.
        public let windowId: String
        /// The task ID to modify.
        public let windowTaskId: String

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, cutoffBehavior: MaintenanceWindowTaskCutoffBehavior? = nil, description: String? = nil, loggingInfo: LoggingInfo? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, name: String? = nil, priority: Int? = nil, replace: Bool? = nil, serviceRoleArn: String? = nil, targets: [Target]? = nil, taskArn: String? = nil, taskInvocationParameters: MaintenanceWindowTaskInvocationParameters? = nil, taskParameters: [String: MaintenanceWindowTaskParameterValueExpression]? = nil, windowId: String, windowTaskId: String) {
            self.alarmConfiguration = alarmConfiguration
            self.cutoffBehavior = cutoffBehavior
            self.description = description
            self.loggingInfo = loggingInfo
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.name = name
            self.priority = priority
            self.replace = replace
            self.serviceRoleArn = serviceRoleArn
            self.targets = targets
            self.taskArn = taskArn
            self.taskInvocationParameters = taskInvocationParameters
            self.taskParameters = taskParameters
            self.windowId = windowId
            self.windowTaskId = windowTaskId
        }

        public func validate(name: String) throws {
            try self.alarmConfiguration?.validate(name: "\(name).alarmConfiguration")
            try self.validate(self.description, name: "description", parent: name, max: 128)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.loggingInfo?.validate(name: "\(name).loggingInfo")
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, max: 7)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, min: 1)
            try self.validate(self.maxConcurrency, name: "maxConcurrency", parent: name, pattern: "^([1-9][0-9]*|[1-9][0-9]%|[1-9]%|100%)$")
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, max: 7)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, min: 1)
            try self.validate(self.maxErrors, name: "maxErrors", parent: name, pattern: "^([1-9][0-9]*|[0]|[1-9][0-9]%|[0-9]%|100%)$")
            try self.validate(self.name, name: "name", parent: name, max: 128)
            try self.validate(self.name, name: "name", parent: name, min: 3)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.validate(self.priority, name: "priority", parent: name, min: 0)
            try self.targets?.forEach {
                try $0.validate(name: "\(name).targets[]")
            }
            try self.validate(self.targets, name: "targets", parent: name, max: 5)
            try self.validate(self.taskArn, name: "taskArn", parent: name, max: 1600)
            try self.validate(self.taskArn, name: "taskArn", parent: name, min: 1)
            try self.taskInvocationParameters?.validate(name: "\(name).taskInvocationParameters")
            try self.taskParameters?.forEach {
                try validate($0.key, name: "taskParameters.key", parent: name, max: 255)
                try validate($0.key, name: "taskParameters.key", parent: name, min: 1)
                try $0.value.validate(name: "\(name).taskParameters[\"\($0.key)\"]")
            }
            try self.validate(self.windowId, name: "windowId", parent: name, max: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, min: 20)
            try self.validate(self.windowId, name: "windowId", parent: name, pattern: "^mw-[0-9a-f]{17}$")
            try self.validate(self.windowTaskId, name: "windowTaskId", parent: name, max: 36)
            try self.validate(self.windowTaskId, name: "windowTaskId", parent: name, min: 36)
            try self.validate(self.windowTaskId, name: "windowTaskId", parent: name, pattern: "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case cutoffBehavior = "CutoffBehavior"
            case description = "Description"
            case loggingInfo = "LoggingInfo"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case name = "Name"
            case priority = "Priority"
            case replace = "Replace"
            case serviceRoleArn = "ServiceRoleArn"
            case targets = "Targets"
            case taskArn = "TaskArn"
            case taskInvocationParameters = "TaskInvocationParameters"
            case taskParameters = "TaskParameters"
            case windowId = "WindowId"
            case windowTaskId = "WindowTaskId"
        }
    }

    public struct UpdateMaintenanceWindowTaskResult: AWSDecodableShape {
        /// The details for the CloudWatch alarm you applied to your maintenance window task.
        public let alarmConfiguration: AlarmConfiguration?
        /// The specification for whether tasks should continue to run after the cutoff time specified in the maintenance windows is reached.
        public let cutoffBehavior: MaintenanceWindowTaskCutoffBehavior?
        /// The updated task description.
        public let description: String?
        /// The updated logging information in Amazon S3.   LoggingInfo has been deprecated. To specify an Amazon Simple Storage Service (Amazon S3) bucket to contain logs, instead use the OutputS3BucketName and OutputS3KeyPrefix options in the TaskInvocationParameters structure. For information about how Amazon Web Services Systems Manager handles these options for the supported maintenance window task types, see MaintenanceWindowTaskInvocationParameters.
        public let loggingInfo: LoggingInfo?
        /// The updated MaxConcurrency value.
        public let maxConcurrency: String?
        /// The updated MaxErrors value.
        public let maxErrors: String?
        /// The updated task name.
        public let name: String?
        /// The updated priority value.
        public let priority: Int?
        /// The Amazon Resource Name (ARN) of the IAM service role for Amazon Web Services Systems Manager to assume when running a maintenance window task. If you do not specify a service role ARN, Systems Manager uses a service-linked role in your account. If no appropriate service-linked role for Systems Manager exists in your account, it is created when you run RegisterTaskWithMaintenanceWindow. However, for an improved security posture, we strongly recommend creating a custom policy and custom service role for running your maintenance window tasks. The policy can be crafted to provide only the permissions needed for your particular maintenance window tasks. For more information, see Setting up Maintenance Windows in the in the Amazon Web Services Systems Manager User Guide.
        public let serviceRoleArn: String?
        /// The updated target values.
        public let targets: [Target]?
        /// The updated task ARN value.
        public let taskArn: String?
        /// The updated parameter values.
        public let taskInvocationParameters: MaintenanceWindowTaskInvocationParameters?
        /// The updated parameter values.   TaskParameters has been deprecated. To specify parameters to pass to a task when it runs, instead use the Parameters option in the TaskInvocationParameters structure. For information about how Systems Manager handles these options for the supported maintenance window task types, see MaintenanceWindowTaskInvocationParameters.
        public let taskParameters: [String: MaintenanceWindowTaskParameterValueExpression]?
        /// The ID of the maintenance window that was updated.
        public let windowId: String?
        /// The task ID of the maintenance window that was updated.
        public let windowTaskId: String?

        @inlinable
        public init(alarmConfiguration: AlarmConfiguration? = nil, cutoffBehavior: MaintenanceWindowTaskCutoffBehavior? = nil, description: String? = nil, loggingInfo: LoggingInfo? = nil, maxConcurrency: String? = nil, maxErrors: String? = nil, name: String? = nil, priority: Int? = nil, serviceRoleArn: String? = nil, targets: [Target]? = nil, taskArn: String? = nil, taskInvocationParameters: MaintenanceWindowTaskInvocationParameters? = nil, taskParameters: [String: MaintenanceWindowTaskParameterValueExpression]? = nil, windowId: String? = nil, windowTaskId: String? = nil) {
            self.alarmConfiguration = alarmConfiguration
            self.cutoffBehavior = cutoffBehavior
            self.description = description
            self.loggingInfo = loggingInfo
            self.maxConcurrency = maxConcurrency
            self.maxErrors = maxErrors
            self.name = name
            self.priority = priority
            self.serviceRoleArn = serviceRoleArn
            self.targets = targets
            self.taskArn = taskArn
            self.taskInvocationParameters = taskInvocationParameters
            self.taskParameters = taskParameters
            self.windowId = windowId
            self.windowTaskId = windowTaskId
        }

        private enum CodingKeys: String, CodingKey {
            case alarmConfiguration = "AlarmConfiguration"
            case cutoffBehavior = "CutoffBehavior"
            case description = "Description"
            case loggingInfo = "LoggingInfo"
            case maxConcurrency = "MaxConcurrency"
            case maxErrors = "MaxErrors"
            case name = "Name"
            case priority = "Priority"
            case serviceRoleArn = "ServiceRoleArn"
            case targets = "Targets"
            case taskArn = "TaskArn"
            case taskInvocationParameters = "TaskInvocationParameters"
            case taskParameters = "TaskParameters"
            case windowId = "WindowId"
            case windowTaskId = "WindowTaskId"
        }
    }

    public struct UpdateManagedInstanceRoleRequest: AWSEncodableShape {
        /// The name of the Identity and Access Management (IAM) role that you want to assign to the managed node. This IAM role must provide AssumeRole permissions for the Amazon Web Services Systems Manager service principal ssm.amazonaws.com. For more information, see Create the IAM service role required for Systems Manager in hybrid and multicloud environments in the Amazon Web Services Systems Manager User Guide.  You can't specify an IAM service-linked role for this parameter. You must create a unique role.
        public let iamRole: String
        /// The ID of the managed node where you want to update the role.
        public let instanceId: String

        @inlinable
        public init(iamRole: String, instanceId: String) {
            self.iamRole = iamRole
            self.instanceId = instanceId
        }

        public func validate(name: String) throws {
            try self.validate(self.iamRole, name: "iamRole", parent: name, max: 64)
            try self.validate(self.instanceId, name: "instanceId", parent: name, max: 124)
            try self.validate(self.instanceId, name: "instanceId", parent: name, min: 20)
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^(^mi-[0-9a-f]{17}$)|(^eks_c:[0-9A-Za-z][A-Za-z0-9\\-_]{0,99}_\\w{17}$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case iamRole = "IamRole"
            case instanceId = "InstanceId"
        }
    }

    public struct UpdateManagedInstanceRoleResult: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateOpsItemRequest: AWSEncodableShape {
        /// The time a runbook workflow ended. Currently reported only for the OpsItem type /aws/changerequest.
        public let actualEndTime: Date?
        /// The time a runbook workflow started. Currently reported only for the OpsItem type /aws/changerequest.
        public let actualStartTime: Date?
        /// Specify a new category for an OpsItem.
        public let category: String?
        /// User-defined text that contains information about the OpsItem, in Markdown format.
        public let description: String?
        /// The Amazon Resource Name (ARN) of an SNS topic where notifications are sent when this OpsItem is edited or changed.
        public let notifications: [OpsItemNotification]?
        /// Add new keys or edit existing key-value pairs of the OperationalData map in the OpsItem object. Operational data is custom data that provides useful reference details about the OpsItem. For example, you can specify log files, error strings, license keys, troubleshooting tips, or other relevant data. You enter operational data as key-value pairs. The key has a maximum length of 128 characters. The value has a maximum size of 20 KB.  Operational data keys can't begin with the following: amazon, aws, amzn, ssm, /amazon, /aws, /amzn, /ssm.  You can choose to make the data searchable by other users in the account or you can restrict search access. Searchable data means that all users with access to the OpsItem Overview page (as provided by the DescribeOpsItems API operation) can view and search on the specified data. Operational data that isn't searchable is only viewable by users who have access to the OpsItem (as provided by the GetOpsItem API operation). Use the /aws/resources key in OperationalData to specify a related resource in the request. Use the /aws/automations key in OperationalData to associate an Automation runbook with the OpsItem. To view Amazon Web Services CLI example commands that use these keys, see Creating OpsItems manually in the Amazon Web Services Systems Manager User Guide.
        public let operationalData: [String: OpsItemDataValue]?
        /// Keys that you want to remove from the OperationalData map.
        public let operationalDataToDelete: [String]?
        /// The OpsItem Amazon Resource Name (ARN).
        public let opsItemArn: String?
        /// The ID of the OpsItem.
        public let opsItemId: String
        /// The time specified in a change request for a runbook workflow to end. Currently supported only for the OpsItem type /aws/changerequest.
        public let plannedEndTime: Date?
        /// The time specified in a change request for a runbook workflow to start. Currently supported only for the OpsItem type /aws/changerequest.
        public let plannedStartTime: Date?
        /// The importance of this OpsItem in relation to other OpsItems in the system.
        public let priority: Int?
        /// One or more OpsItems that share something in common with the current OpsItems. For example, related OpsItems can include OpsItems with similar error messages, impacted resources, or statuses for the impacted resource.
        public let relatedOpsItems: [RelatedOpsItem]?
        /// Specify a new severity for an OpsItem.
        public let severity: String?
        /// The OpsItem status. For more information, see Editing OpsItem details in the Amazon Web Services Systems Manager User Guide.
        public let status: OpsItemStatus?
        /// A short heading that describes the nature of the OpsItem and the impacted resource.
        public let title: String?

        @inlinable
        public init(actualEndTime: Date? = nil, actualStartTime: Date? = nil, category: String? = nil, description: String? = nil, notifications: [OpsItemNotification]? = nil, operationalData: [String: OpsItemDataValue]? = nil, operationalDataToDelete: [String]? = nil, opsItemArn: String? = nil, opsItemId: String, plannedEndTime: Date? = nil, plannedStartTime: Date? = nil, priority: Int? = nil, relatedOpsItems: [RelatedOpsItem]? = nil, severity: String? = nil, status: OpsItemStatus? = nil, title: String? = nil) {
            self.actualEndTime = actualEndTime
            self.actualStartTime = actualStartTime
            self.category = category
            self.description = description
            self.notifications = notifications
            self.operationalData = operationalData
            self.operationalDataToDelete = operationalDataToDelete
            self.opsItemArn = opsItemArn
            self.opsItemId = opsItemId
            self.plannedEndTime = plannedEndTime
            self.plannedStartTime = plannedStartTime
            self.priority = priority
            self.relatedOpsItems = relatedOpsItems
            self.severity = severity
            self.status = status
            self.title = title
        }

        public func validate(name: String) throws {
            try self.validate(self.category, name: "category", parent: name, max: 64)
            try self.validate(self.category, name: "category", parent: name, min: 1)
            try self.validate(self.category, name: "category", parent: name, pattern: "^(?!\\s*$).+$")
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[\\s\\S]*\\S[\\s\\S]*$")
            try self.operationalData?.forEach {
                try validate($0.key, name: "operationalData.key", parent: name, max: 128)
                try validate($0.key, name: "operationalData.key", parent: name, min: 1)
                try validate($0.key, name: "operationalData.key", parent: name, pattern: "^(?!\\s*$).+$")
                try $0.value.validate(name: "\(name).operationalData[\"\($0.key)\"]")
            }
            try self.validate(self.opsItemArn, name: "opsItemArn", parent: name, max: 2048)
            try self.validate(self.opsItemArn, name: "opsItemArn", parent: name, min: 20)
            try self.validate(self.opsItemArn, name: "opsItemArn", parent: name, pattern: "^arn:(aws[a-zA-Z-]*)?:ssm:[a-z0-9-\\.]{0,63}:[0-9]{12}:opsitem")
            try self.validate(self.opsItemId, name: "opsItemId", parent: name, pattern: "^(oi)-[0-9a-f]{12}$")
            try self.validate(self.priority, name: "priority", parent: name, max: 5)
            try self.validate(self.priority, name: "priority", parent: name, min: 1)
            try self.validate(self.severity, name: "severity", parent: name, max: 64)
            try self.validate(self.severity, name: "severity", parent: name, min: 1)
            try self.validate(self.severity, name: "severity", parent: name, pattern: "^(?!\\s*$).+$")
            try self.validate(self.title, name: "title", parent: name, max: 1024)
            try self.validate(self.title, name: "title", parent: name, min: 1)
            try self.validate(self.title, name: "title", parent: name, pattern: "^(?!\\s*$).+$")
        }

        private enum CodingKeys: String, CodingKey {
            case actualEndTime = "ActualEndTime"
            case actualStartTime = "ActualStartTime"
            case category = "Category"
            case description = "Description"
            case notifications = "Notifications"
            case operationalData = "OperationalData"
            case operationalDataToDelete = "OperationalDataToDelete"
            case opsItemArn = "OpsItemArn"
            case opsItemId = "OpsItemId"
            case plannedEndTime = "PlannedEndTime"
            case plannedStartTime = "PlannedStartTime"
            case priority = "Priority"
            case relatedOpsItems = "RelatedOpsItems"
            case severity = "Severity"
            case status = "Status"
            case title = "Title"
        }
    }

    public struct UpdateOpsItemResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateOpsMetadataRequest: AWSEncodableShape {
        /// The metadata keys to delete from the OpsMetadata object.
        public let keysToDelete: [String]?
        /// Metadata to add to an OpsMetadata object.
        public let metadataToUpdate: [String: MetadataValue]?
        /// The Amazon Resource Name (ARN) of the OpsMetadata Object to update.
        public let opsMetadataArn: String

        @inlinable
        public init(keysToDelete: [String]? = nil, metadataToUpdate: [String: MetadataValue]? = nil, opsMetadataArn: String) {
            self.keysToDelete = keysToDelete
            self.metadataToUpdate = metadataToUpdate
            self.opsMetadataArn = opsMetadataArn
        }

        public func validate(name: String) throws {
            try self.keysToDelete?.forEach {
                try validate($0, name: "keysToDelete[]", parent: name, max: 256)
                try validate($0, name: "keysToDelete[]", parent: name, min: 1)
                try validate($0, name: "keysToDelete[]", parent: name, pattern: "^(?!\\s*$).+$")
            }
            try self.validate(self.keysToDelete, name: "keysToDelete", parent: name, max: 10)
            try self.validate(self.keysToDelete, name: "keysToDelete", parent: name, min: 1)
            try self.metadataToUpdate?.forEach {
                try validate($0.key, name: "metadataToUpdate.key", parent: name, max: 256)
                try validate($0.key, name: "metadataToUpdate.key", parent: name, min: 1)
                try validate($0.key, name: "metadataToUpdate.key", parent: name, pattern: "^(?!\\s*$).+$")
                try $0.value.validate(name: "\(name).metadataToUpdate[\"\($0.key)\"]")
            }
            try self.validate(self.metadataToUpdate, name: "metadataToUpdate", parent: name, max: 5)
            try self.validate(self.metadataToUpdate, name: "metadataToUpdate", parent: name, min: 1)
            try self.validate(self.opsMetadataArn, name: "opsMetadataArn", parent: name, max: 1011)
            try self.validate(self.opsMetadataArn, name: "opsMetadataArn", parent: name, min: 1)
            try self.validate(self.opsMetadataArn, name: "opsMetadataArn", parent: name, pattern: "^arn:(aws[a-zA-Z-]*)?:ssm:[a-z0-9-\\.]{0,63}:[a-z0-9-\\.]{0,63}:opsmetadata\\/([a-zA-Z0-9-_\\.\\/]*)$")
        }

        private enum CodingKeys: String, CodingKey {
            case keysToDelete = "KeysToDelete"
            case metadataToUpdate = "MetadataToUpdate"
            case opsMetadataArn = "OpsMetadataArn"
        }
    }

    public struct UpdateOpsMetadataResult: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the OpsMetadata Object that was updated.
        public let opsMetadataArn: String?

        @inlinable
        public init(opsMetadataArn: String? = nil) {
            self.opsMetadataArn = opsMetadataArn
        }

        private enum CodingKeys: String, CodingKey {
            case opsMetadataArn = "OpsMetadataArn"
        }
    }

    public struct UpdatePatchBaselineRequest: AWSEncodableShape {
        /// A set of rules used to include patches in the baseline.
        public let approvalRules: PatchRuleGroup?
        /// A list of explicitly approved patches for the baseline. For information about accepted formats for lists of approved patches and rejected patches, see Package name formats for approved and rejected patch lists in the Amazon Web Services Systems Manager User Guide.
        public let approvedPatches: [String]?
        /// Assigns a new compliance severity level to an existing patch baseline.
        public let approvedPatchesComplianceLevel: PatchComplianceLevel?
        /// Indicates whether the list of approved patches includes non-security updates that should be applied to the managed nodes. The default value is false. Applies to Linux managed nodes only.
        public let approvedPatchesEnableNonSecurity: Bool?
        /// Indicates the status to be assigned to security patches that are available but not approved because they don't meet the installation criteria specified in the patch baseline. Example scenario: Security patches that you might want installed can be skipped if you have specified a long period to wait after a patch is released before installation. If an update to the patch is released during your specified waiting period, the waiting period for installing the patch starts over. If the waiting period is too long, multiple versions of the patch could be released but never installed. Supported for Windows Server managed nodes only.
        public let availableSecurityUpdatesComplianceStatus: PatchComplianceStatus?
        /// The ID of the patch baseline to update.
        public let baselineId: String
        /// A description of the patch baseline.
        public let description: String?
        /// A set of global filters used to include patches in the baseline.  The GlobalFilters parameter can be configured only by using the CLI or an Amazon Web Services SDK. It can't be configured from the Patch Manager console, and its value isn't displayed in the console.
        public let globalFilters: PatchFilterGroup?
        /// The name of the patch baseline.
        public let name: String?
        /// A list of explicitly rejected patches for the baseline. For information about accepted formats for lists of approved patches and rejected patches, see Package name formats for approved and rejected patch lists in the Amazon Web Services Systems Manager User Guide.
        public let rejectedPatches: [String]?
        /// The action for Patch Manager to take on patches included in the RejectedPackages list.  ALLOW_AS_DEPENDENCY   Linux and macOS: A package in the rejected patches list is installed only if it is a dependency of another package. It is considered compliant with the patch baseline, and its status is reported as INSTALLED_OTHER. This is the default action if no option is specified.  Windows Server: Windows Server doesn't support the concept of package dependencies. If a package in the rejected patches list and already installed on the node, its status is reported as INSTALLED_OTHER. Any package not already installed on the node is skipped. This is the default action if no option is specified.  BLOCK   All OSs: Packages in the rejected patches list, and packages that include them as dependencies, aren't installed by Patch Manager under any circumstances. If a package was installed before it was added to the rejected patches list, or is installed outside of Patch Manager afterward, it's considered noncompliant with the patch baseline and its status is reported as INSTALLED_REJECTED.
        public let rejectedPatchesAction: PatchAction?
        /// If True, then all fields that are required by the CreatePatchBaseline operation are also required for this API request. Optional fields that aren't specified are set to null.
        public let replace: Bool?
        /// Information about the patches to use to update the managed nodes, including target operating systems and source repositories. Applies to Linux managed nodes only.
        public let sources: [PatchSource]?

        @inlinable
        public init(approvalRules: PatchRuleGroup? = nil, approvedPatches: [String]? = nil, approvedPatchesComplianceLevel: PatchComplianceLevel? = nil, approvedPatchesEnableNonSecurity: Bool? = nil, availableSecurityUpdatesComplianceStatus: PatchComplianceStatus? = nil, baselineId: String, description: String? = nil, globalFilters: PatchFilterGroup? = nil, name: String? = nil, rejectedPatches: [String]? = nil, rejectedPatchesAction: PatchAction? = nil, replace: Bool? = nil, sources: [PatchSource]? = nil) {
            self.approvalRules = approvalRules
            self.approvedPatches = approvedPatches
            self.approvedPatchesComplianceLevel = approvedPatchesComplianceLevel
            self.approvedPatchesEnableNonSecurity = approvedPatchesEnableNonSecurity
            self.availableSecurityUpdatesComplianceStatus = availableSecurityUpdatesComplianceStatus
            self.baselineId = baselineId
            self.description = description
            self.globalFilters = globalFilters
            self.name = name
            self.rejectedPatches = rejectedPatches
            self.rejectedPatchesAction = rejectedPatchesAction
            self.replace = replace
            self.sources = sources
        }

        public func validate(name: String) throws {
            try self.approvalRules?.validate(name: "\(name).approvalRules")
            try self.approvedPatches?.forEach {
                try validate($0, name: "approvedPatches[]", parent: name, max: 100)
                try validate($0, name: "approvedPatches[]", parent: name, min: 1)
            }
            try self.validate(self.approvedPatches, name: "approvedPatches", parent: name, max: 50)
            try self.validate(self.baselineId, name: "baselineId", parent: name, max: 128)
            try self.validate(self.baselineId, name: "baselineId", parent: name, min: 20)
            try self.validate(self.baselineId, name: "baselineId", parent: name, pattern: "^[a-zA-Z0-9_\\-:/]{20,128}$")
            try self.validate(self.description, name: "description", parent: name, max: 1024)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.globalFilters?.validate(name: "\(name).globalFilters")
            try self.validate(self.name, name: "name", parent: name, max: 128)
            try self.validate(self.name, name: "name", parent: name, min: 3)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_\\-.]{3,128}$")
            try self.rejectedPatches?.forEach {
                try validate($0, name: "rejectedPatches[]", parent: name, max: 100)
                try validate($0, name: "rejectedPatches[]", parent: name, min: 1)
            }
            try self.validate(self.rejectedPatches, name: "rejectedPatches", parent: name, max: 50)
            try self.sources?.forEach {
                try $0.validate(name: "\(name).sources[]")
            }
            try self.validate(self.sources, name: "sources", parent: name, max: 20)
        }

        private enum CodingKeys: String, CodingKey {
            case approvalRules = "ApprovalRules"
            case approvedPatches = "ApprovedPatches"
            case approvedPatchesComplianceLevel = "ApprovedPatchesComplianceLevel"
            case approvedPatchesEnableNonSecurity = "ApprovedPatchesEnableNonSecurity"
            case availableSecurityUpdatesComplianceStatus = "AvailableSecurityUpdatesComplianceStatus"
            case baselineId = "BaselineId"
            case description = "Description"
            case globalFilters = "GlobalFilters"
            case name = "Name"
            case rejectedPatches = "RejectedPatches"
            case rejectedPatchesAction = "RejectedPatchesAction"
            case replace = "Replace"
            case sources = "Sources"
        }
    }

    public struct UpdatePatchBaselineResult: AWSDecodableShape {
        /// A set of rules used to include patches in the baseline.
        public let approvalRules: PatchRuleGroup?
        /// A list of explicitly approved patches for the baseline.
        public let approvedPatches: [String]?
        /// The compliance severity level assigned to the patch baseline after the update completed.
        public let approvedPatchesComplianceLevel: PatchComplianceLevel?
        /// Indicates whether the list of approved patches includes non-security updates that should be applied to the managed nodes. The default value is false. Applies to Linux managed nodes only.
        public let approvedPatchesEnableNonSecurity: Bool?
        /// Indicates the compliance status of managed nodes for which security-related patches are available but were not approved. This preference is specified when the CreatePatchBaseline or UpdatePatchBaseline commands are run. Applies to Windows Server managed nodes only.
        public let availableSecurityUpdatesComplianceStatus: PatchComplianceStatus?
        /// The ID of the deleted patch baseline.
        public let baselineId: String?
        /// The date when the patch baseline was created.
        public let createdDate: Date?
        /// A description of the patch baseline.
        public let description: String?
        /// A set of global filters used to exclude patches from the baseline.
        public let globalFilters: PatchFilterGroup?
        /// The date when the patch baseline was last modified.
        public let modifiedDate: Date?
        /// The name of the patch baseline.
        public let name: String?
        /// The operating system rule used by the updated patch baseline.
        public let operatingSystem: OperatingSystem?
        /// A list of explicitly rejected patches for the baseline.
        public let rejectedPatches: [String]?
        /// The action specified to take on patches included in the RejectedPatches list. A patch can be allowed only if it is a dependency of another package, or blocked entirely along with packages that include it as a dependency.
        public let rejectedPatchesAction: PatchAction?
        /// Information about the patches to use to update the managed nodes, including target operating systems and source repositories. Applies to Linux managed nodes only.
        public let sources: [PatchSource]?

        @inlinable
        public init(approvalRules: PatchRuleGroup? = nil, approvedPatches: [String]? = nil, approvedPatchesComplianceLevel: PatchComplianceLevel? = nil, approvedPatchesEnableNonSecurity: Bool? = nil, availableSecurityUpdatesComplianceStatus: PatchComplianceStatus? = nil, baselineId: String? = nil, createdDate: Date? = nil, description: String? = nil, globalFilters: PatchFilterGroup? = nil, modifiedDate: Date? = nil, name: String? = nil, operatingSystem: OperatingSystem? = nil, rejectedPatches: [String]? = nil, rejectedPatchesAction: PatchAction? = nil, sources: [PatchSource]? = nil) {
            self.approvalRules = approvalRules
            self.approvedPatches = approvedPatches
            self.approvedPatchesComplianceLevel = approvedPatchesComplianceLevel
            self.approvedPatchesEnableNonSecurity = approvedPatchesEnableNonSecurity
            self.availableSecurityUpdatesComplianceStatus = availableSecurityUpdatesComplianceStatus
            self.baselineId = baselineId
            self.createdDate = createdDate
            self.description = description
            self.globalFilters = globalFilters
            self.modifiedDate = modifiedDate
            self.name = name
            self.operatingSystem = operatingSystem
            self.rejectedPatches = rejectedPatches
            self.rejectedPatchesAction = rejectedPatchesAction
            self.sources = sources
        }

        private enum CodingKeys: String, CodingKey {
            case approvalRules = "ApprovalRules"
            case approvedPatches = "ApprovedPatches"
            case approvedPatchesComplianceLevel = "ApprovedPatchesComplianceLevel"
            case approvedPatchesEnableNonSecurity = "ApprovedPatchesEnableNonSecurity"
            case availableSecurityUpdatesComplianceStatus = "AvailableSecurityUpdatesComplianceStatus"
            case baselineId = "BaselineId"
            case createdDate = "CreatedDate"
            case description = "Description"
            case globalFilters = "GlobalFilters"
            case modifiedDate = "ModifiedDate"
            case name = "Name"
            case operatingSystem = "OperatingSystem"
            case rejectedPatches = "RejectedPatches"
            case rejectedPatchesAction = "RejectedPatchesAction"
            case sources = "Sources"
        }
    }

    public struct UpdateResourceDataSyncRequest: AWSEncodableShape {
        /// The name of the resource data sync you want to update.
        public let syncName: String
        /// Specify information about the data sources to synchronize.
        public let syncSource: ResourceDataSyncSource
        /// The type of resource data sync. The supported SyncType is SyncFromSource.
        public let syncType: String

        @inlinable
        public init(syncName: String, syncSource: ResourceDataSyncSource, syncType: String) {
            self.syncName = syncName
            self.syncSource = syncSource
            self.syncType = syncType
        }

        public func validate(name: String) throws {
            try self.validate(self.syncName, name: "syncName", parent: name, max: 64)
            try self.validate(self.syncName, name: "syncName", parent: name, min: 1)
            try self.syncSource.validate(name: "\(name).syncSource")
            try self.validate(self.syncType, name: "syncType", parent: name, max: 64)
            try self.validate(self.syncType, name: "syncType", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case syncName = "SyncName"
            case syncSource = "SyncSource"
            case syncType = "SyncType"
        }
    }

    public struct UpdateResourceDataSyncResult: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateServiceSettingRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the service setting to update. For example, arn:aws:ssm:us-east-1:111122223333:servicesetting/ssm/parameter-store/high-throughput-enabled. The setting ID can be one of the following.    /ssm/appmanager/appmanager-enabled     /ssm/automation/customer-script-log-destination     /ssm/automation/customer-script-log-group-name    /ssm/automation/enable-adaptive-concurrency    /ssm/documents/console/public-sharing-permission     /ssm/managed-instance/activation-tier     /ssm/managed-instance/default-ec2-instance-management-role     /ssm/opsinsights/opscenter     /ssm/parameter-store/default-parameter-tier     /ssm/parameter-store/high-throughput-enabled     Permissions to update the /ssm/managed-instance/default-ec2-instance-management-role setting should only be provided to administrators. Implement least privilege access when allowing individuals to configure or modify the Default Host Management Configuration.
        public let settingId: String
        /// The new value to specify for the service setting. The following list specifies the available values for each setting.   For /ssm/appmanager/appmanager-enabled, enter True or False.   For /ssm/automation/customer-script-log-destination, enter CloudWatch.   For /ssm/automation/customer-script-log-group-name, enter the name of an Amazon CloudWatch Logs log group.   For /ssm/documents/console/public-sharing-permission, enter Enable or Disable.   For /ssm/managed-instance/activation-tier, enter standard or advanced.   For /ssm/managed-instance/default-ec2-instance-management-role, enter the name of an IAM role.    For /ssm/opsinsights/opscenter, enter Enabled or Disabled.    For /ssm/parameter-store/default-parameter-tier, enter Standard, Advanced, or Intelligent-Tiering    For /ssm/parameter-store/high-throughput-enabled, enter true or false.
        public let settingValue: String

        @inlinable
        public init(settingId: String, settingValue: String) {
            self.settingId = settingId
            self.settingValue = settingValue
        }

        public func validate(name: String) throws {
            try self.validate(self.settingId, name: "settingId", parent: name, max: 1000)
            try self.validate(self.settingId, name: "settingId", parent: name, min: 1)
            try self.validate(self.settingValue, name: "settingValue", parent: name, max: 4096)
            try self.validate(self.settingValue, name: "settingValue", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case settingId = "SettingId"
            case settingValue = "SettingValue"
        }
    }

    public struct UpdateServiceSettingResult: AWSDecodableShape {
        public init() {}
    }

    public struct ValidationException: AWSErrorShape {
        public let message: String?
        /// The reason code for the invalid request.
        public let reasonCode: String?

        @inlinable
        public init(message: String? = nil, reasonCode: String? = nil) {
            self.message = message
            self.reasonCode = reasonCode
        }

        private enum CodingKeys: String, CodingKey {
            case message = "Message"
            case reasonCode = "ReasonCode"
        }
    }

    public struct ExecutionInputs: AWSEncodableShape {
        /// Information about the optional inputs that can be specified for an automation execution preview.
        public let automation: AutomationExecutionInputs?

        @inlinable
        public init(automation: AutomationExecutionInputs? = nil) {
            self.automation = automation
        }

        public func validate(name: String) throws {
            try self.automation?.validate(name: "\(name).automation")
        }

        private enum CodingKeys: String, CodingKey {
            case automation = "Automation"
        }
    }

    public struct ExecutionPreview: AWSDecodableShape {
        /// Information about the changes that would be made if an Automation workflow were run.
        public let automation: AutomationExecutionPreview?

        @inlinable
        public init(automation: AutomationExecutionPreview? = nil) {
            self.automation = automation
        }

        private enum CodingKeys: String, CodingKey {
            case automation = "Automation"
        }
    }

    public struct NodeType: AWSDecodableShape {
        /// Information about a specific managed node.
        public let instance: InstanceInfo?

        @inlinable
        public init(instance: InstanceInfo? = nil) {
            self.instance = instance
        }

        private enum CodingKeys: String, CodingKey {
            case instance = "Instance"
        }
    }
}

// MARK: - Errors

/// Error enum for SSM
public struct SSMErrorType: AWSErrorType {
    enum Code: String {
        case accessDeniedException = "AccessDeniedException"
        case alreadyExistsException = "AlreadyExistsException"
        case associatedInstances = "AssociatedInstances"
        case associationAlreadyExists = "AssociationAlreadyExists"
        case associationDoesNotExist = "AssociationDoesNotExist"
        case associationExecutionDoesNotExist = "AssociationExecutionDoesNotExist"
        case associationLimitExceeded = "AssociationLimitExceeded"
        case associationVersionLimitExceeded = "AssociationVersionLimitExceeded"
        case automationDefinitionNotApprovedException = "AutomationDefinitionNotApprovedException"
        case automationDefinitionNotFoundException = "AutomationDefinitionNotFoundException"
        case automationDefinitionVersionNotFoundException = "AutomationDefinitionVersionNotFoundException"
        case automationExecutionLimitExceededException = "AutomationExecutionLimitExceededException"
        case automationExecutionNotFoundException = "AutomationExecutionNotFoundException"
        case automationStepNotFoundException = "AutomationStepNotFoundException"
        case complianceTypeCountLimitExceededException = "ComplianceTypeCountLimitExceededException"
        case customSchemaCountLimitExceededException = "CustomSchemaCountLimitExceededException"
        case documentAlreadyExists = "DocumentAlreadyExists"
        case documentLimitExceeded = "DocumentLimitExceeded"
        case documentPermissionLimit = "DocumentPermissionLimit"
        case documentVersionLimitExceeded = "DocumentVersionLimitExceeded"
        case doesNotExistException = "DoesNotExistException"
        case duplicateDocumentContent = "DuplicateDocumentContent"
        case duplicateDocumentVersionName = "DuplicateDocumentVersionName"
        case duplicateInstanceId = "DuplicateInstanceId"
        case featureNotAvailableException = "FeatureNotAvailableException"
        case hierarchyLevelLimitExceededException = "HierarchyLevelLimitExceededException"
        case hierarchyTypeMismatchException = "HierarchyTypeMismatchException"
        case idempotentParameterMismatch = "IdempotentParameterMismatch"
        case incompatiblePolicyException = "IncompatiblePolicyException"
        case internalServerError = "InternalServerError"
        case invalidActivation = "InvalidActivation"
        case invalidActivationId = "InvalidActivationId"
        case invalidAggregatorException = "InvalidAggregatorException"
        case invalidAllowedPatternException = "InvalidAllowedPatternException"
        case invalidAssociation = "InvalidAssociation"
        case invalidAssociationVersion = "InvalidAssociationVersion"
        case invalidAutomationExecutionParametersException = "InvalidAutomationExecutionParametersException"
        case invalidAutomationSignalException = "InvalidAutomationSignalException"
        case invalidAutomationStatusUpdateException = "InvalidAutomationStatusUpdateException"
        case invalidCommandId = "InvalidCommandId"
        case invalidDeleteInventoryParametersException = "InvalidDeleteInventoryParametersException"
        case invalidDeletionIdException = "InvalidDeletionIdException"
        case invalidDocument = "InvalidDocument"
        case invalidDocumentContent = "InvalidDocumentContent"
        case invalidDocumentOperation = "InvalidDocumentOperation"
        case invalidDocumentSchemaVersion = "InvalidDocumentSchemaVersion"
        case invalidDocumentType = "InvalidDocumentType"
        case invalidDocumentVersion = "InvalidDocumentVersion"
        case invalidFilter = "InvalidFilter"
        case invalidFilterKey = "InvalidFilterKey"
        case invalidFilterOption = "InvalidFilterOption"
        case invalidFilterValue = "InvalidFilterValue"
        case invalidInstanceId = "InvalidInstanceId"
        case invalidInstanceInformationFilterValue = "InvalidInstanceInformationFilterValue"
        case invalidInstancePropertyFilterValue = "InvalidInstancePropertyFilterValue"
        case invalidInventoryGroupException = "InvalidInventoryGroupException"
        case invalidInventoryItemContextException = "InvalidInventoryItemContextException"
        case invalidInventoryRequestException = "InvalidInventoryRequestException"
        case invalidItemContentException = "InvalidItemContentException"
        case invalidKeyId = "InvalidKeyId"
        case invalidNextToken = "InvalidNextToken"
        case invalidNotificationConfig = "InvalidNotificationConfig"
        case invalidOptionException = "InvalidOptionException"
        case invalidOutputFolder = "InvalidOutputFolder"
        case invalidOutputLocation = "InvalidOutputLocation"
        case invalidParameters = "InvalidParameters"
        case invalidPermissionType = "InvalidPermissionType"
        case invalidPluginName = "InvalidPluginName"
        case invalidPolicyAttributeException = "InvalidPolicyAttributeException"
        case invalidPolicyTypeException = "InvalidPolicyTypeException"
        case invalidResourceId = "InvalidResourceId"
        case invalidResourceType = "InvalidResourceType"
        case invalidResultAttributeException = "InvalidResultAttributeException"
        case invalidRole = "InvalidRole"
        case invalidSchedule = "InvalidSchedule"
        case invalidTag = "InvalidTag"
        case invalidTarget = "InvalidTarget"
        case invalidTargetMaps = "InvalidTargetMaps"
        case invalidTypeNameException = "InvalidTypeNameException"
        case invalidUpdate = "InvalidUpdate"
        case invocationDoesNotExist = "InvocationDoesNotExist"
        case itemContentMismatchException = "ItemContentMismatchException"
        case itemSizeLimitExceededException = "ItemSizeLimitExceededException"
        case malformedResourcePolicyDocumentException = "MalformedResourcePolicyDocumentException"
        case maxDocumentSizeExceeded = "MaxDocumentSizeExceeded"
        case opsItemAccessDeniedException = "OpsItemAccessDeniedException"
        case opsItemAlreadyExistsException = "OpsItemAlreadyExistsException"
        case opsItemConflictException = "OpsItemConflictException"
        case opsItemInvalidParameterException = "OpsItemInvalidParameterException"
        case opsItemLimitExceededException = "OpsItemLimitExceededException"
        case opsItemNotFoundException = "OpsItemNotFoundException"
        case opsItemRelatedItemAlreadyExistsException = "OpsItemRelatedItemAlreadyExistsException"
        case opsItemRelatedItemAssociationNotFoundException = "OpsItemRelatedItemAssociationNotFoundException"
        case opsMetadataAlreadyExistsException = "OpsMetadataAlreadyExistsException"
        case opsMetadataInvalidArgumentException = "OpsMetadataInvalidArgumentException"
        case opsMetadataKeyLimitExceededException = "OpsMetadataKeyLimitExceededException"
        case opsMetadataLimitExceededException = "OpsMetadataLimitExceededException"
        case opsMetadataNotFoundException = "OpsMetadataNotFoundException"
        case opsMetadataTooManyUpdatesException = "OpsMetadataTooManyUpdatesException"
        case parameterAlreadyExists = "ParameterAlreadyExists"
        case parameterLimitExceeded = "ParameterLimitExceeded"
        case parameterMaxVersionLimitExceeded = "ParameterMaxVersionLimitExceeded"
        case parameterNotFound = "ParameterNotFound"
        case parameterPatternMismatchException = "ParameterPatternMismatchException"
        case parameterVersionLabelLimitExceeded = "ParameterVersionLabelLimitExceeded"
        case parameterVersionNotFound = "ParameterVersionNotFound"
        case policiesLimitExceededException = "PoliciesLimitExceededException"
        case resourceDataSyncAlreadyExistsException = "ResourceDataSyncAlreadyExistsException"
        case resourceDataSyncConflictException = "ResourceDataSyncConflictException"
        case resourceDataSyncCountExceededException = "ResourceDataSyncCountExceededException"
        case resourceDataSyncInvalidConfigurationException = "ResourceDataSyncInvalidConfigurationException"
        case resourceDataSyncNotFoundException = "ResourceDataSyncNotFoundException"
        case resourceInUseException = "ResourceInUseException"
        case resourceLimitExceededException = "ResourceLimitExceededException"
        case resourceNotFoundException = "ResourceNotFoundException"
        case resourcePolicyConflictException = "ResourcePolicyConflictException"
        case resourcePolicyInvalidParameterException = "ResourcePolicyInvalidParameterException"
        case resourcePolicyLimitExceededException = "ResourcePolicyLimitExceededException"
        case resourcePolicyNotFoundException = "ResourcePolicyNotFoundException"
        case serviceQuotaExceededException = "ServiceQuotaExceededException"
        case serviceSettingNotFound = "ServiceSettingNotFound"
        case statusUnchanged = "StatusUnchanged"
        case subTypeCountLimitExceededException = "SubTypeCountLimitExceededException"
        case targetInUseException = "TargetInUseException"
        case targetNotConnected = "TargetNotConnected"
        case throttlingException = "ThrottlingException"
        case tooManyTagsError = "TooManyTagsError"
        case tooManyUpdates = "TooManyUpdates"
        case totalSizeLimitExceededException = "TotalSizeLimitExceededException"
        case unsupportedCalendarException = "UnsupportedCalendarException"
        case unsupportedFeatureRequiredException = "UnsupportedFeatureRequiredException"
        case unsupportedInventoryItemContextException = "UnsupportedInventoryItemContextException"
        case unsupportedInventorySchemaVersionException = "UnsupportedInventorySchemaVersionException"
        case unsupportedOperatingSystem = "UnsupportedOperatingSystem"
        case unsupportedOperationException = "UnsupportedOperationException"
        case unsupportedParameterType = "UnsupportedParameterType"
        case unsupportedPlatformType = "UnsupportedPlatformType"
        case validationException = "ValidationException"
    }

    private let error: Code
    public let context: AWSErrorContext?

    /// initialize SSM
    public init?(errorCode: String, context: AWSErrorContext) {
        guard let error = Code(rawValue: errorCode) else { return nil }
        self.error = error
        self.context = context
    }

    internal init(_ error: Code) {
        self.error = error
        self.context = nil
    }

    /// return error code string
    public var errorCode: String { self.error.rawValue }

    /// The requester doesn't have permissions to perform the requested operation.
    public static var accessDeniedException: Self { .init(.accessDeniedException) }
    /// Error returned if an attempt is made to register a patch group with a patch baseline that is already registered with a different patch baseline.
    public static var alreadyExistsException: Self { .init(.alreadyExistsException) }
    /// You must disassociate a document from all managed nodes before you can delete it.
    public static var associatedInstances: Self { .init(.associatedInstances) }
    /// The specified association already exists.
    public static var associationAlreadyExists: Self { .init(.associationAlreadyExists) }
    /// The specified association doesn't exist.
    public static var associationDoesNotExist: Self { .init(.associationDoesNotExist) }
    /// The specified execution ID doesn't exist. Verify the ID number and try again.
    public static var associationExecutionDoesNotExist: Self { .init(.associationExecutionDoesNotExist) }
    /// You can have at most 2,000 active associations.
    public static var associationLimitExceeded: Self { .init(.associationLimitExceeded) }
    /// You have reached the maximum number versions allowed for an association. Each association has a limit of 1,000 versions.
    public static var associationVersionLimitExceeded: Self { .init(.associationVersionLimitExceeded) }
    /// Indicates that the Change Manager change template used in the change request was rejected or is still in a pending state.
    public static var automationDefinitionNotApprovedException: Self { .init(.automationDefinitionNotApprovedException) }
    /// An Automation runbook with the specified name couldn't be found.
    public static var automationDefinitionNotFoundException: Self { .init(.automationDefinitionNotFoundException) }
    /// An Automation runbook with the specified name and version couldn't be found.
    public static var automationDefinitionVersionNotFoundException: Self { .init(.automationDefinitionVersionNotFoundException) }
    /// The number of simultaneously running Automation executions exceeded the allowable limit.
    public static var automationExecutionLimitExceededException: Self { .init(.automationExecutionLimitExceededException) }
    /// There is no automation execution information for the requested automation execution ID.
    public static var automationExecutionNotFoundException: Self { .init(.automationExecutionNotFoundException) }
    /// The specified step name and execution ID don't exist. Verify the information and try again.
    public static var automationStepNotFoundException: Self { .init(.automationStepNotFoundException) }
    /// You specified too many custom compliance types. You can specify a maximum of 10 different types.
    public static var complianceTypeCountLimitExceededException: Self { .init(.complianceTypeCountLimitExceededException) }
    /// You have exceeded the limit for custom schemas. Delete one or more custom schemas and try again.
    public static var customSchemaCountLimitExceededException: Self { .init(.customSchemaCountLimitExceededException) }
    /// The specified document already exists.
    public static var documentAlreadyExists: Self { .init(.documentAlreadyExists) }
    /// You can have at most 500 active SSM documents.
    public static var documentLimitExceeded: Self { .init(.documentLimitExceeded) }
    /// The document can't be shared with more Amazon Web Services accounts. You can specify a maximum of 20 accounts per API operation to share a private document. By default, you can share a private document with a maximum of 1,000 accounts and publicly share up to five documents. If you need to increase the quota for privately or publicly shared Systems Manager documents, contact Amazon Web Services Support.
    public static var documentPermissionLimit: Self { .init(.documentPermissionLimit) }
    /// The document has too many versions. Delete one or more document versions and try again.
    public static var documentVersionLimitExceeded: Self { .init(.documentVersionLimitExceeded) }
    /// Error returned when the ID specified for a resource, such as a maintenance window or patch baseline, doesn't exist. For information about resource quotas in Amazon Web Services Systems Manager, see Systems Manager service quotas in the Amazon Web Services General Reference.
    public static var doesNotExistException: Self { .init(.doesNotExistException) }
    /// The content of the association document matches another document. Change the content of the document and try again.
    public static var duplicateDocumentContent: Self { .init(.duplicateDocumentContent) }
    /// The version name has already been used in this document. Specify a different version name, and then try again.
    public static var duplicateDocumentVersionName: Self { .init(.duplicateDocumentVersionName) }
    /// You can't specify a managed node ID in more than one association.
    public static var duplicateInstanceId: Self { .init(.duplicateInstanceId) }
    /// You attempted to register a LAMBDA or STEP_FUNCTIONS task in a region where the corresponding service isn't available.
    public static var featureNotAvailableException: Self { .init(.featureNotAvailableException) }
    /// A hierarchy can have a maximum of 15 levels. For more information, see Requirements and constraints for parameter names in the Amazon Web Services Systems Manager User Guide.
    public static var hierarchyLevelLimitExceededException: Self { .init(.hierarchyLevelLimitExceededException) }
    /// Parameter Store doesn't support changing a parameter type in a hierarchy. For example, you can't change a parameter from a String type to a SecureString type. You must create a new, unique parameter.
    public static var hierarchyTypeMismatchException: Self { .init(.hierarchyTypeMismatchException) }
    /// Error returned when an idempotent operation is retried and the parameters don't match the original call to the API with the same idempotency token.
    public static var idempotentParameterMismatch: Self { .init(.idempotentParameterMismatch) }
    /// There is a conflict in the policies specified for this parameter. You can't, for example, specify two Expiration policies for a parameter. Review your policies, and try again.
    public static var incompatiblePolicyException: Self { .init(.incompatiblePolicyException) }
    /// An error occurred on the server side.
    public static var internalServerError: Self { .init(.internalServerError) }
    /// The activation isn't valid. The activation might have been deleted, or the ActivationId and the ActivationCode don't match.
    public static var invalidActivation: Self { .init(.invalidActivation) }
    /// The activation ID isn't valid. Verify that you entered the correct ActivationId or ActivationCode and try again.
    public static var invalidActivationId: Self { .init(.invalidActivationId) }
    /// The specified aggregator isn't valid for the group type. Verify that the aggregator you provided is supported.
    public static var invalidAggregatorException: Self { .init(.invalidAggregatorException) }
    /// The request doesn't meet the regular expression requirement.
    public static var invalidAllowedPatternException: Self { .init(.invalidAllowedPatternException) }
    /// The association isn't valid or doesn't exist.
    public static var invalidAssociation: Self { .init(.invalidAssociation) }
    /// The version you specified isn't valid. Use ListAssociationVersions to view all versions of an association according to the association ID. Or, use the $LATEST parameter to view the latest version of the association.
    public static var invalidAssociationVersion: Self { .init(.invalidAssociationVersion) }
    /// The supplied parameters for invoking the specified Automation runbook are incorrect. For example, they may not match the set of parameters permitted for the specified Automation document.
    public static var invalidAutomationExecutionParametersException: Self { .init(.invalidAutomationExecutionParametersException) }
    /// The signal isn't valid for the current Automation execution.
    public static var invalidAutomationSignalException: Self { .init(.invalidAutomationSignalException) }
    /// The specified update status operation isn't valid.
    public static var invalidAutomationStatusUpdateException: Self { .init(.invalidAutomationStatusUpdateException) }
    /// The specified command ID isn't valid. Verify the ID and try again.
    public static var invalidCommandId: Self { .init(.invalidCommandId) }
    /// One or more of the parameters specified for the delete operation isn't valid. Verify all parameters and try again.
    public static var invalidDeleteInventoryParametersException: Self { .init(.invalidDeleteInventoryParametersException) }
    /// The ID specified for the delete operation doesn't exist or isn't valid. Verify the ID and try again.
    public static var invalidDeletionIdException: Self { .init(.invalidDeletionIdException) }
    /// The specified SSM document doesn't exist.
    public static var invalidDocument: Self { .init(.invalidDocument) }
    /// The content for the document isn't valid.
    public static var invalidDocumentContent: Self { .init(.invalidDocumentContent) }
    /// You attempted to delete a document while it is still shared. You must stop sharing the document before you can delete it.
    public static var invalidDocumentOperation: Self { .init(.invalidDocumentOperation) }
    /// The version of the document schema isn't supported.
    public static var invalidDocumentSchemaVersion: Self { .init(.invalidDocumentSchemaVersion) }
    /// The SSM document type isn't valid. Valid document types are described in the DocumentType property.
    public static var invalidDocumentType: Self { .init(.invalidDocumentType) }
    /// The document version isn't valid or doesn't exist.
    public static var invalidDocumentVersion: Self { .init(.invalidDocumentVersion) }
    /// The filter name isn't valid. Verify that you entered the correct name and try again.
    public static var invalidFilter: Self { .init(.invalidFilter) }
    /// The specified key isn't valid.
    public static var invalidFilterKey: Self { .init(.invalidFilterKey) }
    /// The specified filter option isn't valid. Valid options are Equals and BeginsWith. For Path filter, valid options are Recursive and OneLevel.
    public static var invalidFilterOption: Self { .init(.invalidFilterOption) }
    /// The filter value isn't valid. Verify the value and try again.
    public static var invalidFilterValue: Self { .init(.invalidFilterValue) }
    /// The following problems can cause this exception:   You don't have permission to access the managed node.   Amazon Web Services Systems Manager Agent (SSM Agent) isn't running. Verify that SSM Agent is running.   SSM Agent isn't registered with the SSM endpoint. Try reinstalling SSM Agent.   The managed node isn't in a valid state. Valid states are: Running, Pending, Stopped, and Stopping. Invalid states are: Shutting-down and Terminated.
    public static var invalidInstanceId: Self { .init(.invalidInstanceId) }
    /// The specified filter value isn't valid.
    public static var invalidInstanceInformationFilterValue: Self { .init(.invalidInstanceInformationFilterValue) }
    /// The specified filter value isn't valid.
    public static var invalidInstancePropertyFilterValue: Self { .init(.invalidInstancePropertyFilterValue) }
    /// The specified inventory group isn't valid.
    public static var invalidInventoryGroupException: Self { .init(.invalidInventoryGroupException) }
    /// You specified invalid keys or values in the Context attribute for InventoryItem. Verify the keys and values, and try again.
    public static var invalidInventoryItemContextException: Self { .init(.invalidInventoryItemContextException) }
    /// The request isn't valid.
    public static var invalidInventoryRequestException: Self { .init(.invalidInventoryRequestException) }
    /// One or more content items isn't valid.
    public static var invalidItemContentException: Self { .init(.invalidItemContentException) }
    /// The query key ID isn't valid.
    public static var invalidKeyId: Self { .init(.invalidKeyId) }
    /// The specified token isn't valid.
    public static var invalidNextToken: Self { .init(.invalidNextToken) }
    /// One or more configuration items isn't valid. Verify that a valid Amazon Resource Name (ARN) was provided for an Amazon Simple Notification Service topic.
    public static var invalidNotificationConfig: Self { .init(.invalidNotificationConfig) }
    /// The delete inventory option specified isn't valid. Verify the option and try again.
    public static var invalidOptionException: Self { .init(.invalidOptionException) }
    /// The S3 bucket doesn't exist.
    public static var invalidOutputFolder: Self { .init(.invalidOutputFolder) }
    /// The output location isn't valid or doesn't exist.
    public static var invalidOutputLocation: Self { .init(.invalidOutputLocation) }
    /// You must specify values for all required parameters in the Amazon Web Services Systems Manager document (SSM document). You can only supply values to parameters defined in the SSM document.
    public static var invalidParameters: Self { .init(.invalidParameters) }
    /// The permission type isn't supported. Share is the only supported permission type.
    public static var invalidPermissionType: Self { .init(.invalidPermissionType) }
    /// The plugin name isn't valid.
    public static var invalidPluginName: Self { .init(.invalidPluginName) }
    /// A policy attribute or its value is invalid.
    public static var invalidPolicyAttributeException: Self { .init(.invalidPolicyAttributeException) }
    /// The policy type isn't supported. Parameter Store supports the following policy types: Expiration, ExpirationNotification, and NoChangeNotification.
    public static var invalidPolicyTypeException: Self { .init(.invalidPolicyTypeException) }
    /// The resource ID isn't valid. Verify that you entered the correct ID and try again.
    public static var invalidResourceId: Self { .init(.invalidResourceId) }
    /// The resource type isn't valid. For example, if you are attempting to tag an EC2 instance, the instance must be a registered managed node.
    public static var invalidResourceType: Self { .init(.invalidResourceType) }
    /// The specified inventory item result attribute isn't valid.
    public static var invalidResultAttributeException: Self { .init(.invalidResultAttributeException) }
    /// The role name can't contain invalid characters. Also verify that you specified an IAM role for notifications that includes the required trust policy. For information about configuring the IAM role for Run Command notifications, see Monitoring Systems Manager status changes using Amazon SNS notifications in the Amazon Web Services Systems Manager User Guide.
    public static var invalidRole: Self { .init(.invalidRole) }
    /// The schedule is invalid. Verify your cron or rate expression and try again.
    public static var invalidSchedule: Self { .init(.invalidSchedule) }
    /// The specified tag key or value isn't valid.
    public static var invalidTag: Self { .init(.invalidTag) }
    /// The target isn't valid or doesn't exist. It might not be configured for Systems Manager or you might not have permission to perform the operation.
    public static var invalidTarget: Self { .init(.invalidTarget) }
    /// TargetMap parameter isn't valid.
    public static var invalidTargetMaps: Self { .init(.invalidTargetMaps) }
    /// The parameter type name isn't valid.
    public static var invalidTypeNameException: Self { .init(.invalidTypeNameException) }
    /// The update isn't valid.
    public static var invalidUpdate: Self { .init(.invalidUpdate) }
    /// The command ID and managed node ID you specified didn't match any invocations. Verify the command ID and the managed node ID and try again.
    public static var invocationDoesNotExist: Self { .init(.invocationDoesNotExist) }
    /// The inventory item has invalid content.
    public static var itemContentMismatchException: Self { .init(.itemContentMismatchException) }
    /// The inventory item size has exceeded the size limit.
    public static var itemSizeLimitExceededException: Self { .init(.itemSizeLimitExceededException) }
    /// The specified policy document is malformed or invalid, or excessive PutResourcePolicy or DeleteResourcePolicy calls have been made.
    public static var malformedResourcePolicyDocumentException: Self { .init(.malformedResourcePolicyDocumentException) }
    /// The size limit of a document is 64 KB.
    public static var maxDocumentSizeExceeded: Self { .init(.maxDocumentSizeExceeded) }
    /// You don't have permission to view OpsItems in the specified account. Verify that your account is configured either as a Systems Manager delegated administrator or that you are logged into the Organizations management account.
    public static var opsItemAccessDeniedException: Self { .init(.opsItemAccessDeniedException) }
    /// The OpsItem already exists.
    public static var opsItemAlreadyExistsException: Self { .init(.opsItemAlreadyExistsException) }
    /// The specified OpsItem is in the process of being deleted.
    public static var opsItemConflictException: Self { .init(.opsItemConflictException) }
    /// A specified parameter argument isn't valid. Verify the available arguments and try again.
    public static var opsItemInvalidParameterException: Self { .init(.opsItemInvalidParameterException) }
    /// The request caused OpsItems to exceed one or more quotas.
    public static var opsItemLimitExceededException: Self { .init(.opsItemLimitExceededException) }
    /// The specified OpsItem ID doesn't exist. Verify the ID and try again.
    public static var opsItemNotFoundException: Self { .init(.opsItemNotFoundException) }
    /// The Amazon Resource Name (ARN) is already associated with the OpsItem.
    public static var opsItemRelatedItemAlreadyExistsException: Self { .init(.opsItemRelatedItemAlreadyExistsException) }
    /// The association wasn't found using the parameters you specified in the call. Verify the information and try again.
    public static var opsItemRelatedItemAssociationNotFoundException: Self { .init(.opsItemRelatedItemAssociationNotFoundException) }
    /// An OpsMetadata object already exists for the selected resource.
    public static var opsMetadataAlreadyExistsException: Self { .init(.opsMetadataAlreadyExistsException) }
    /// One of the arguments passed is invalid.
    public static var opsMetadataInvalidArgumentException: Self { .init(.opsMetadataInvalidArgumentException) }
    /// The OpsMetadata object exceeds the maximum number of OpsMetadata keys that you can assign to an application in Application Manager.
    public static var opsMetadataKeyLimitExceededException: Self { .init(.opsMetadataKeyLimitExceededException) }
    /// Your account reached the maximum number of OpsMetadata objects allowed by Application Manager. The maximum is 200 OpsMetadata objects. Delete one or more OpsMetadata object and try again.
    public static var opsMetadataLimitExceededException: Self { .init(.opsMetadataLimitExceededException) }
    /// The OpsMetadata object doesn't exist.
    public static var opsMetadataNotFoundException: Self { .init(.opsMetadataNotFoundException) }
    /// The system is processing too many concurrent updates. Wait a few moments and try again.
    public static var opsMetadataTooManyUpdatesException: Self { .init(.opsMetadataTooManyUpdatesException) }
    /// The parameter already exists. You can't create duplicate parameters.
    public static var parameterAlreadyExists: Self { .init(.parameterAlreadyExists) }
    /// You have exceeded the number of parameters for this Amazon Web Services account. Delete one or more parameters and try again.
    public static var parameterLimitExceeded: Self { .init(.parameterLimitExceeded) }
    /// Parameter Store retains the 100 most recently created versions of a parameter. After this number of versions has been created, Parameter Store deletes the oldest version when a new one is created. However, if the oldest version has a label attached to it, Parameter Store won't delete the version and instead presents this error message:  An error occurred (ParameterMaxVersionLimitExceeded) when calling the PutParameter operation: You attempted to create a new version of parameter-name by calling the PutParameter API with the overwrite flag. Version version-number, the oldest version, can't be deleted because it has a label associated with it. Move the label to another version of the parameter, and try again.  This safeguard is to prevent parameter versions with mission critical labels assigned to them from being deleted. To continue creating new parameters, first move the label from the oldest version of the parameter to a newer one for use in your operations. For information about moving parameter labels, see Move a parameter label (console) or Move a parameter label (CLI) in the Amazon Web Services Systems Manager User Guide.
    public static var parameterMaxVersionLimitExceeded: Self { .init(.parameterMaxVersionLimitExceeded) }
    /// The parameter couldn't be found. Verify the name and try again.  For the DeleteParameter and GetParameter actions, if the specified parameter doesn't exist, the ParameterNotFound exception is not recorded in CloudTrail event logs.
    public static var parameterNotFound: Self { .init(.parameterNotFound) }
    /// The parameter name isn't valid.
    public static var parameterPatternMismatchException: Self { .init(.parameterPatternMismatchException) }
    /// A parameter version can have a maximum of ten labels.
    public static var parameterVersionLabelLimitExceeded: Self { .init(.parameterVersionLabelLimitExceeded) }
    /// The specified parameter version wasn't found. Verify the parameter name and version, and try again.
    public static var parameterVersionNotFound: Self { .init(.parameterVersionNotFound) }
    /// You specified more than the maximum number of allowed policies for the parameter. The maximum is 10.
    public static var policiesLimitExceededException: Self { .init(.policiesLimitExceededException) }
    /// A sync configuration with the same name already exists.
    public static var resourceDataSyncAlreadyExistsException: Self { .init(.resourceDataSyncAlreadyExistsException) }
    /// Another UpdateResourceDataSync request is being processed. Wait a few minutes and try again.
    public static var resourceDataSyncConflictException: Self { .init(.resourceDataSyncConflictException) }
    /// You have exceeded the allowed maximum sync configurations.
    public static var resourceDataSyncCountExceededException: Self { .init(.resourceDataSyncCountExceededException) }
    /// The specified sync configuration is invalid.
    public static var resourceDataSyncInvalidConfigurationException: Self { .init(.resourceDataSyncInvalidConfigurationException) }
    /// The specified sync name wasn't found.
    public static var resourceDataSyncNotFoundException: Self { .init(.resourceDataSyncNotFoundException) }
    /// Error returned if an attempt is made to delete a patch baseline that is registered for a patch group.
    public static var resourceInUseException: Self { .init(.resourceInUseException) }
    /// Error returned when the caller has exceeded the default resource quotas. For example, too many maintenance windows or patch baselines have been created. For information about resource quotas in Systems Manager, see Systems Manager service quotas in the Amazon Web Services General Reference.
    public static var resourceLimitExceededException: Self { .init(.resourceLimitExceededException) }
    /// The specified parameter to be shared could not be found.
    public static var resourceNotFoundException: Self { .init(.resourceNotFoundException) }
    /// The hash provided in the call doesn't match the stored hash. This exception is thrown when trying to update an obsolete policy version or when multiple requests to update a policy are sent.
    public static var resourcePolicyConflictException: Self { .init(.resourcePolicyConflictException) }
    /// One or more parameters specified for the call aren't valid. Verify the parameters and their values and try again.
    public static var resourcePolicyInvalidParameterException: Self { .init(.resourcePolicyInvalidParameterException) }
    /// The PutResourcePolicy API action enforces two limits. A policy can't be greater than 1024 bytes in size. And only one policy can be attached to OpsItemGroup. Verify these limits and try again.
    public static var resourcePolicyLimitExceededException: Self { .init(.resourcePolicyLimitExceededException) }
    /// No policies with the specified policy ID and hash could be found.
    public static var resourcePolicyNotFoundException: Self { .init(.resourcePolicyNotFoundException) }
    /// The request exceeds the service quota. Service quotas, also referred to as limits, are the maximum number of service resources or operations for your Amazon Web Services account.
    public static var serviceQuotaExceededException: Self { .init(.serviceQuotaExceededException) }
    /// The specified service setting wasn't found. Either the service name or the setting hasn't been provisioned by the Amazon Web Services service team.
    public static var serviceSettingNotFound: Self { .init(.serviceSettingNotFound) }
    /// The updated status is the same as the current status.
    public static var statusUnchanged: Self { .init(.statusUnchanged) }
    /// The sub-type count exceeded the limit for the inventory type.
    public static var subTypeCountLimitExceededException: Self { .init(.subTypeCountLimitExceededException) }
    /// You specified the Safe option for the DeregisterTargetFromMaintenanceWindow operation, but the target is still referenced in a task.
    public static var targetInUseException: Self { .init(.targetInUseException) }
    /// The specified target managed node for the session isn't fully configured for use with Session Manager. For more information, see Setting up Session Manager in the Amazon Web Services Systems Manager User Guide. This error is also returned if you attempt to start a session on a managed node that is located in a different account or Region
    public static var targetNotConnected: Self { .init(.targetNotConnected) }
    /// The request or operation couldn't be performed because the service is throttling requests.
    public static var throttlingException: Self { .init(.throttlingException) }
    /// The Targets parameter includes too many tags. Remove one or more tags and try the command again.
    public static var tooManyTagsError: Self { .init(.tooManyTagsError) }
    /// There are concurrent updates for a resource that supports one update at a time.
    public static var tooManyUpdates: Self { .init(.tooManyUpdates) }
    /// The size of inventory data has exceeded the total size limit for the resource.
    public static var totalSizeLimitExceededException: Self { .init(.totalSizeLimitExceededException) }
    /// The calendar entry contained in the specified SSM document isn't supported.
    public static var unsupportedCalendarException: Self { .init(.unsupportedCalendarException) }
    /// Patching for applications released by Microsoft is only available on EC2 instances and advanced instances. To patch applications released by Microsoft on on-premises servers and VMs, you must enable advanced instances. For more information, see Turning on the advanced-instances tier in the Amazon Web Services Systems Manager User Guide.
    public static var unsupportedFeatureRequiredException: Self { .init(.unsupportedFeatureRequiredException) }
    /// The Context attribute that you specified for the InventoryItem isn't allowed for this inventory type. You can only use the Context attribute with inventory types like AWS:ComplianceItem.
    public static var unsupportedInventoryItemContextException: Self { .init(.unsupportedInventoryItemContextException) }
    /// Inventory item type schema version has to match supported versions in the service. Check output of GetInventorySchema to see the available schema version for each type.
    public static var unsupportedInventorySchemaVersionException: Self { .init(.unsupportedInventorySchemaVersionException) }
    /// The operating systems you specified isn't supported, or the operation isn't supported for the operating system.
    public static var unsupportedOperatingSystem: Self { .init(.unsupportedOperatingSystem) }
    /// This operation is not supported for the current account. You must first enable the Systems Manager integrated experience in your account.
    public static var unsupportedOperationException: Self { .init(.unsupportedOperationException) }
    /// The parameter type isn't supported.
    public static var unsupportedParameterType: Self { .init(.unsupportedParameterType) }
    /// The document doesn't support the platform type of the given managed node IDs. For example, you sent an document for a Windows managed node to a Linux node.
    public static var unsupportedPlatformType: Self { .init(.unsupportedPlatformType) }
    /// The request isn't valid. Verify that you entered valid contents for the command and try again.
    public static var validationException: Self { .init(.validationException) }
}

extension SSMErrorType: AWSServiceErrorType {
    public static let errorCodeMap: [String: AWSErrorShape.Type] = [
        "InvalidItemContentException": SSM.InvalidItemContentException.self,
        "ItemContentMismatchException": SSM.ItemContentMismatchException.self,
        "ItemSizeLimitExceededException": SSM.ItemSizeLimitExceededException.self,
        "OpsItemAlreadyExistsException": SSM.OpsItemAlreadyExistsException.self,
        "OpsItemInvalidParameterException": SSM.OpsItemInvalidParameterException.self,
        "OpsItemLimitExceededException": SSM.OpsItemLimitExceededException.self,
        "OpsItemRelatedItemAlreadyExistsException": SSM.OpsItemRelatedItemAlreadyExistsException.self,
        "ResourceDataSyncAlreadyExistsException": SSM.ResourceDataSyncAlreadyExistsException.self,
        "ResourceDataSyncNotFoundException": SSM.ResourceDataSyncNotFoundException.self,
        "ResourcePolicyInvalidParameterException": SSM.ResourcePolicyInvalidParameterException.self,
        "ResourcePolicyLimitExceededException": SSM.ResourcePolicyLimitExceededException.self,
        "ServiceQuotaExceededException": SSM.ServiceQuotaExceededException.self,
        "ThrottlingException": SSM.ThrottlingException.self,
        "UnsupportedInventoryItemContextException": SSM.UnsupportedInventoryItemContextException.self,
        "ValidationException": SSM.ValidationException.self
    ]
}

extension SSMErrorType: Equatable {
    public static func == (lhs: SSMErrorType, rhs: SSMErrorType) -> Bool {
        lhs.error == rhs.error
    }
}

extension SSMErrorType: CustomStringConvertible {
    public var description: String {
        return "\(self.error.rawValue): \(self.message ?? "")"
    }
}
